Avoid shell command injection in main.cpp
This commit is contained in:
@@ -27,7 +27,7 @@ class Client
|
||||
posix_kill($this->pid, SIGTERM);
|
||||
$clientFilePath = getClientFilePath($this->id);
|
||||
if (file_exists($clientFilePath)) {
|
||||
$fp = fopen($clientFilePath, "r+");
|
||||
$fp = fopen($clientFilePath, 'r+');
|
||||
if (flock($fp, LOCK_EX, $WAIT_IF_LOCKED)) { // acquire an exclusive lock
|
||||
unlink($clientFilePath); // delete file
|
||||
flock($fp, LOCK_UN); // release the lock
|
||||
@@ -92,8 +92,6 @@ class MyProcess implements MessageComponentInterface
|
||||
|
||||
public function onMessage(ConnectionInterface $from, $msg)
|
||||
{
|
||||
// As we are going to use this argument in a shell command, we escape it.
|
||||
$msg = escapeshellarg($msg);
|
||||
$client = $this->clients->offsetGet($from);
|
||||
// If a previous request was received, we execute the new one with another client for simplicity otherwise with current file deletion approach, we can't tell the worker `search.py` that we don't care about its execution anymore.
|
||||
if ($client->pid !== null) {
|
||||
@@ -105,6 +103,8 @@ class MyProcess implements MessageComponentInterface
|
||||
$clientFilePath = getClientFilePath($clientId);
|
||||
// Create the worker output file otherwise it would believe that we don't need this worker anymore.
|
||||
file_put_contents($clientFilePath, '');
|
||||
// As we are going to use this argument in a shell command, we escape it.
|
||||
$msg = escapeshellarg($msg);
|
||||
// Start the independent worker.
|
||||
// Redirecting `stdout` is mandatory otherwise `exec` is blocking.
|
||||
$client->pid = exec("./search.py $clientId $msg > /dev/null & echo $!");
|
||||
@@ -114,7 +114,7 @@ class MyProcess implements MessageComponentInterface
|
||||
// If the worker output file doesn't exist anymore, then it means that the worker have finished its work and acknowledged that `websocket.php` completely read its output.
|
||||
if (file_exists($clientFilePath)) {
|
||||
// `flock` requires `r`eading permission and we need `w`riting one due to `ftruncate` usage.
|
||||
$fp = fopen($clientFilePath, "r+");
|
||||
$fp = fopen($clientFilePath, 'r+');
|
||||
$read = null;
|
||||
if (flock($fp, LOCK_EX, $WAIT_IF_LOCKED)) { // acquire an exclusive lock
|
||||
// We assume that the temporary output is less than 1 MB long.
|
||||
|
Reference in New Issue
Block a user