mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Scribunto
synced 2024-11-25 08:36:21 +00:00
7f94d88733
I252ec046 noticeably broke things by adding a dependency on the pcntl functions, which tend not to be present under Apache. It also subtly broke exit handling by using proc_close()'s return value, which PHP mangles in such a way that we can't tell the difference between an actual XCPU kill and exit( SIGXCPU ). This one wasn't noticed because the pcntl functions interpret everything proc_close() is going to return as a signal kill and we didn't test the 'exited' code path. I'm not sure what was going on in I57cdf8aa since it provides no details about what it was trying to fix, but that would have broken signal handling in the other way: Ibf5f4656 worked because proc_open() on Linux executes the command by passing it to /bin/sh -c, and that shell is going to turn any signal that kills Lua (e.g. the SIGXCPU) into an exit status of 128+signum. To avoid proc_close()'s broken return value while also avoiding the race, we can loop on proc_get_status() until $status['running'] is false. To have signals that kill Lua actually be interpreted as signals, we have two options: add an "exec" in front of the command so proc_open()'s /bin/sh -c is execed away, or detect shell-style signal reporting and convert it. We may as well do both. Bug: T128048 Change-Id: I8a62e1660fe1694e9ba5de77d01960c1ab4580aa
177 lines
4.6 KiB
Plaintext
177 lines
4.6 KiB
Plaintext
The Lua standalone engine has a message-based protocol for communicating between
|
|
PHP and Lua.
|
|
|
|
Messages start with a 16 byte header. The first 8 bytes are the body length in
|
|
hexadecimal. The second 8 bytes are (length * 2 - 1) also in hexadecimal.
|
|
|
|
For messages passed from PHP to Lua, the body is encoded as a Lua expression.
|
|
The expression may reference a table in a variable called "chunks", which
|
|
contains an array of functions.
|
|
|
|
Messages passed from Lua to PHP have their body encoded in PHP serialize()
|
|
format, and then "\\", "\r", and "\n" are replaced with "\\\\", "\\r", and
|
|
"\\n" to avoid issues with text-mode file handles. They may include instances
|
|
of function objects which have an "id" member for passing back to Lua as an
|
|
index in the chunk table.
|
|
|
|
The expressions encoded into the message bodies are associative arrays. The "op"
|
|
member of the array gives the operation to be performed by the message.
|
|
|
|
Every request message demands exactly one response message in reply. When a
|
|
request message is sent, the responder does not need to send the corresponding
|
|
response message as its next message. It may instead send its own request
|
|
message. In this way, a stack of pending requests can be accumulated. This
|
|
mechanism allows re-entrant and recursive calls.
|
|
|
|
All numerically-indexed arrays should start from index 1 unless otherwise
|
|
specified. Note that the number of values in an array may not match what Lua's
|
|
'#' operator returns if the array contains nils.
|
|
|
|
== Request messages sent from PHP to Lua ==
|
|
|
|
=== loadString ===
|
|
|
|
Load some executable Lua code (a "chunk") and return the resulting function ID.
|
|
|
|
Message parameters:
|
|
* op: "loadString"
|
|
* text: The string to load
|
|
* chunkName: The name of the string, for use in error messages
|
|
|
|
On success, the response message is:
|
|
|
|
* op: "return"
|
|
* nvalues: 1
|
|
* values: An array with a single element with the ID in it
|
|
|
|
On failure, the response message is:
|
|
|
|
* op: "error"
|
|
* value: The error message
|
|
|
|
=== call ===
|
|
|
|
Call a Lua function.
|
|
|
|
Message parameters:
|
|
* op: "call"
|
|
* id: The chunk ID
|
|
* nargs: Number of arguments, including nils
|
|
* args: The argument array
|
|
|
|
On success, the response message is:
|
|
|
|
* op: "return"
|
|
* nvalues: Number of return values, including nils
|
|
* values: All return values as an array
|
|
|
|
On failure, the response message is:
|
|
|
|
* op: "error"
|
|
* value: The value given to error(), usually an error message
|
|
* trace: A table giving a backtrace of the stack as it was when error() was
|
|
called, in a similar format to the one used by debug.getinfo(). Element 1 of
|
|
the table is the function that called error(), element 2 is the function that
|
|
called that, and so on.
|
|
|
|
=== registerLibrary ===
|
|
|
|
Register a set of functions in the sandbox environment.
|
|
|
|
Message parameters:
|
|
* op: "registerLibrary"
|
|
* name: The global variable name to register. May contain "." characters to
|
|
specify a global variable subtable.
|
|
* functions: An associative array mapping function name to ID
|
|
|
|
On success, the response message is:
|
|
|
|
* op: "return"
|
|
* nvalues: 0
|
|
* values: An empty array
|
|
|
|
On failure the response message is:
|
|
|
|
* op: "error"
|
|
* value: The error message
|
|
|
|
=== getStatus ===
|
|
|
|
Get status information about the Lua process.
|
|
|
|
Message parameters:
|
|
* op: "getStatus"
|
|
|
|
On success, the response message is:
|
|
|
|
* op: "return"
|
|
* nvalues: 1
|
|
* values: An array with a single element, which is an associative array mapping
|
|
status key to value. The status keys are:
|
|
** pid: The process identifier
|
|
** time: The amount of user and system time spent by the process, measured in clock ticks
|
|
** vsize: The virtual memory size in bytes
|
|
** rss: The resident set size in bytes
|
|
|
|
On failure, the response message is:
|
|
|
|
* op: "return"
|
|
* nvalues: 0
|
|
* values: An empty array
|
|
|
|
=== cleanupChunks ===
|
|
|
|
Tell Lua to release any chunks no longer referenced by PHP.
|
|
|
|
Message parameters:
|
|
* op: "cleanupChunks"
|
|
* ids: Table with keys being the chunk IDs still referenced by PHP, and non-falsey values
|
|
|
|
The response message is:
|
|
|
|
* op: "return"
|
|
* nvalues: 0
|
|
* values: An empty array
|
|
|
|
=== quit ===
|
|
|
|
Request graceful shutdown.
|
|
|
|
Message parameters:
|
|
* op: "quit"
|
|
|
|
No return message will be sent.
|
|
|
|
=== testquit ===
|
|
|
|
Request non-graceful shutdown, for testing.
|
|
|
|
Message parameters:
|
|
* op: "testquit"
|
|
|
|
No return message will be sent.
|
|
|
|
== Request messages sent from Lua to PHP ==
|
|
|
|
=== call ===
|
|
|
|
Call a PHP function.
|
|
|
|
Message parameters:
|
|
* op: "call"
|
|
* id: The function ID given by registerLibrary
|
|
* nargs: Number of arguments, including nils
|
|
* args: An array giving the function arguments
|
|
|
|
On success, the response message is:
|
|
|
|
* op: "return"
|
|
* nvalues: Number of return values, including nils
|
|
* values: All return values as an array
|
|
|
|
On failure the response message is:
|
|
|
|
* op: "error"
|
|
* value: The error message
|
|
|