Skip to content

Commit

Permalink
Avoid potentially sharing execute() state
Browse files Browse the repository at this point in the history
  • Loading branch information
hluk committed Jun 27, 2024
1 parent ebc324b commit a0d487f
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 35 deletions.
53 changes: 24 additions & 29 deletions src/scriptable/scriptable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1904,9 +1904,9 @@ QJSValue Scriptable::execute()
{
m_skipArguments = -1;

m_executeStdoutData.clear();
m_executeStdoutLastLine.clear();
m_executeStdoutCallback = QJSValue();
QByteArray executeStdoutData;
QString executeStdoutLastLine;
QJSValue executeStdoutCallback;

// Pass all arguments until null to command. The rest will be sent to stdin.
QStringList args;
Expand All @@ -1917,7 +1917,7 @@ QJSValue Scriptable::execute()
break;

if ( arg.isCallable() )
m_executeStdoutCallback = arg;
executeStdoutCallback = arg;
else
args.append( toString(arg) );
}
Expand All @@ -1926,7 +1926,7 @@ QJSValue Scriptable::execute()
for ( ++i ; i < argumentCount(); ++i ) {
const auto arg = argument(i);
if ( arg.isCallable() )
m_executeStdoutCallback = arg;
executeStdoutCallback = arg;
else
action.setInput( action.input() + makeByteArray(arg) );
}
Expand All @@ -1935,26 +1935,36 @@ QJSValue Scriptable::execute()
action.setReadOutput(true);

connect( &action, &Action::actionOutput,
this, &Scriptable::onExecuteOutput );
this, [&](const QByteArray &output) {
executeStdoutData.append(output);
});
if ( executeStdoutCallback.isCallable() ) {
connect( &action, &Action::actionOutput,
this, [&](const QByteArray &output) {
executeStdoutLastLine.append( getTextData(output) );
auto lines = executeStdoutLastLine.split('\n');
executeStdoutLastLine = lines.takeLast();
if ( !lines.isEmpty() ) {
const auto arg = toScriptValue(lines, m_engine);
call( "executeStdoutCallback", &executeStdoutCallback, {arg} );
}
});
}

if ( !runAction(&action) || action.actionFailed() ) {
return throwError( QStringLiteral("Failed to run command") );
}

if ( m_executeStdoutCallback.isCallable() ) {
const auto arg = toScriptValue(m_executeStdoutLastLine, m_engine);
call( "executeStdoutCallback", &m_executeStdoutCallback, {arg} );
if ( executeStdoutCallback.isCallable() ) {
const auto arg = toScriptValue(executeStdoutLastLine, m_engine);
call( "executeStdoutCallback", &executeStdoutCallback, {arg} );
}

QJSValue actionResult = m_engine->newObject();
actionResult.setProperty( QStringLiteral("stdout"), newByteArray(m_executeStdoutData) );
actionResult.setProperty( QStringLiteral("stdout"), newByteArray(executeStdoutData) );
actionResult.setProperty( QStringLiteral("stderr"), getTextData(action.errorOutput()) );
actionResult.setProperty( QStringLiteral("exit_code"), action.exitCode() );

m_executeStdoutData.clear();
m_executeStdoutLastLine.clear();
m_executeStdoutCallback = QJSValue();

return actionResult;
}

Expand Down Expand Up @@ -2673,21 +2683,6 @@ void Scriptable::collectScriptOverrides()
m_proxy->setScriptOverrides(overrides);
}

void Scriptable::onExecuteOutput(const QByteArray &output)
{
m_executeStdoutData.append(output);

if ( m_executeStdoutCallback.isCallable() ) {
m_executeStdoutLastLine.append( getTextData(output) );
auto lines = m_executeStdoutLastLine.split('\n');
m_executeStdoutLastLine = lines.takeLast();
if ( !lines.isEmpty() ) {
const auto arg = toScriptValue(lines, m_engine);
call( "executeStdoutCallback", &m_executeStdoutCallback, {arg} );
}
}
}

void Scriptable::onMonitorClipboardChanged(const QVariantMap &data, ClipboardOwnership ownership)
{
COPYQ_LOG( QStringLiteral("onMonitorClipboardChanged: %1 %2, owner is \"%3\"")
Expand Down
6 changes: 0 additions & 6 deletions src/scriptable/scriptable.h
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,6 @@ public slots:
void receiveData();

private:
void onExecuteOutput(const QByteArray &output);
void onMonitorClipboardChanged(const QVariantMap &data, ClipboardOwnership ownership);
void onMonitorClipboardUnchanged(const QVariantMap &data);
void onSynchronizeSelection(ClipboardMode sourceMode, uint sourceTextHash, uint targetTextHash);
Expand Down Expand Up @@ -483,11 +482,6 @@ public slots:
Abort m_abort = Abort::None;
int m_skipArguments = 0;

// FIXME: Parameters for execute() shouldn't be global.
QByteArray m_executeStdoutData;
QString m_executeStdoutLastLine;
QJSValue m_executeStdoutCallback;

bool m_displayFunctionsLock = false;

QJSValue m_plugins;
Expand Down

0 comments on commit a0d487f

Please sign in to comment.