Age | Commit message (Collapse) | Author |
|
The sizeof(size_t) might differ from the sizeof(uint32_t) used to serialize
compiled bytecode, so extra care is needed to properly encode and decode
upvalue slot values which are defined as (size_t)-1 / 2 + n.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
Extend abstract source objects to maintain a list of exported symbols and
add functions to append and lookup exported names.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
Reject modifications on array values with a type exception when
the constant flag is set on the array operated upon.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
When stringifying upvalue references, resolve their target value and
convert it to a string. Only yield the abstract string representation
if the target value cannot be resolved.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
The upcoming module import support requires constant object values to
implement module wildcard import.
Reuse the existing u64 bit in ucv heads to mark array or object values
as constant and add corresponding `ucv_is_constant()` and
`ucv_set_constant()` helpers.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
Add support for the `import`, `export`, `from` and `as` keywords used in
module import and export statements.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
- Use nested switches instead of lookup tables to detect tokens
- Simplify input buffer logic
- Reduce amount of intermediate states
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
lexer: fix parsing with disabled block left stripping
|
|
rtnl: fix parsing/creation of IFLA_AF_SPEC RTA for the AF_BRIDGE family
|
|
When a template was parsed with global block left stripping disabled, then
any text preceding an expression or statement block start tag was incorrectly
prepended to the first token value of the block, leading to syntax errors in
the compiler.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
Some pecularities in the encoding of the IFLA_AF_SPEC attribute make it
unsuitable for table driven parsing/generation.
To solve this issue, introduce specific datatype handling for IFLA_AF_SPEC
and parse/generate the RTA depending on the address family of the containing
netlink message.
Also add some missing constants while we're at it.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
compiler: fix stack mismatch on continue statements nested in switches
|
|
When compiling continue statements nested in switches, the compiler only
emitted pop statements for the local variables in the switch body scope,
but not for the locals in the scope(s) leading up to the containing loop
body.
Extend the compilers internal patchlist structure to keep track of the
type of scope tied to the patchlist and extend `continue` statement
compilation logic to select the appropriate parent patch list in order
to determine the amount of locals (stack slots) to clear before the
emitted jump instruction.
As a result, the `uc_compiler_backpatch()` implementation can be simplified
somewhat since we do not need to propagate entries to parent lists anymore.
Also add a further regression test case to cover this issue.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
ubus: end uloop on exceptions in managed code
|
|
uloop: end uloop on exceptions in managed code
|
|
Instead of silently continuing, end the uloop when encountering exceptions
in ucode callbacks to let those exceptions propagate to the host program.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
Instead of silently continuing, end the uloop when encountering exceptions
in ucode callbacks to let those exceptions propagate to the host program.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
rtnl: expose IFLA_STATS64 contents
|
|
Decode IFLA_STATS64 attribute and make contained counters available to ucode.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
rtnl: expose ifinfomsg.ifi_change member
|
|
For certain operations, such as bringing up interfaces, it is required to
initialize the ifi_change mask in the ifinfomsg struct.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
rtnl: update NETLINK_GET_STRICT_CHK socket flag with every request
|
|
compiler: fix stack mismatch on nonmatching switch statements with lo…
|
|
nl80211: fix NL80211_SURVEY_INFO_NOISE datatype
|
|
So far the NETLINK_GET_STRICT_CHK socket flag was only set on the implicit
socket creation performed during the first request and ignored for
subsequent ones which made it impossible to perform only some requests
with enabled strict checking.
Modify the logic to check the flag state for every request and change
it if needed. This allows performing both strict and non-strict requests
over the same connection.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
Report the noise value as signed integer to calling ucode.
Reported-by: John Crispin <john@phrozen.org>
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
When a switch statement containing cases with local variable declarations
and no default case is evalulated and none of the the cases matched, the
local variable slots were never initialized but got popped off the stack
when execution resumed after the switch scope, leading to a mismatch in
stack layout between compiler and runtime, causing local variables to
yield wrong values or a stack underflow triggering a segmentation fault.
Solve this issue by patching the last conditional case match jump to hop
beyond the local variable pop instructions when no default case is defined.
Also extend the regression test case dealing with other switch related
stack mismatch issues to cover this particular problem as well.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
nl80211: recognize further NL80211_STA_INFO_* NLAs
|
|
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
struct: add optional offset argument to `unpack()`
|
|
Extend the `unpack()` function to take an optional, second offset parameter
which is useful to skip an initial portion of the input data without having
to encode pad bytes into the format string.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
rtnl: fix segmentation fault on parsing linkinfo RTA without data
|
|
rtnl: zero request message headers
|
|
rtnl: fix premature netlink reply receive abort
|
|
Some link types, such as veth, yield an IFLA_LINKINFO nla without an
embedded IFLA_INFO_DATA / INFLA_INFO_SLAVE_DATA nla which causes the
nla converter to dereference a NULL nla pointer.
Properly deal with such cases and check for the existence of the
child nla before attempting to parse it.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
rtnl: avoid stray "netlink: %d bytes leftover after parsing attributes."
|
|
struct: fix packing `*` format after other repeated formats
|
|
For route netlink request messages having a header struct, uc_nl_request()
invokes nlmsg_reserve() to reserve room for the struct data but the
nlmsg_reserve() function only zeroes additional alignment bytes, not the
actual reserved buffer space.
Extend the existing logic to explicitly zero out the reserved header space
in order to avoid sending uninitialized struct member values to the kernel.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
The nl_recvmsgs() logic in uc_nl_request() incorrectly stopped reading
the socket before the netlink ACK message was handled for non-multipart
replies.
This caused subsequent requests to incorrectly receive the ACK of the
previous request, leading to a failure to receive the actual reply.
Fix this issue by continue reading the socket until either the finish
callback for multipart (dump) messages or the ack callback for non-
multipart messages was received.
This fix is basically the same as the one applied to the nl80211 module
in 54ef6c0 ("nl80211: fix premature netlink reply receive abort").
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
Some nested RTAs such as IFLA_INET_CONF do not contain actual sub-RTAs but
just an array of integers. Avoid calling a no-op `nla_parse()` for such
attributes to suppress the non-harmful leftover bytes warning emitted by
libnl.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
When packing a format such as `!6C*`, the `*` format was not included into
the result buffer due to improper tracking of the function argument offset.
Solve this issue by taking field repetitions into account when tracking
the argument offset while calculating the size of dynamic arguments.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
Number literals
|
|
- Recognize new number literal prefixes `0o` and `0O` for octal as well
as `0b` and `0B` for binary number literals
- Treat number literals with leading zeros as octal while parsing but
as decimal ones on implicit number conversions, means `012` will yield
`10` while `+"012"` or `"012" + 0` will yield `12`
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
For string cases, turn `int()` into a thin `strtoll()` wrapper which
attempts to parse the initial portion of the string as a decimal integer
literal, optionally preceded by white space and a sign character.
Also introduce an optional `base` argument for string cases while we're
at it and adjust the existing stdlib test case accordingly.
The function now behaves mostly the same as ECMAScript `parseInt(val, 10)`
for string cases, means it will recognize `012` as `12` and not `10` and
it will accept trailing non-digit characters after the initial portition
of the input string.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
ci: make jobs faster during pull request testing
|
|
lib: rework uc_index() implementation
|
|
- Fix segfault on passing string haystack with non-string needle argument
- Perform strict equality tests against array haystacks
- Make string searches binary safe
- Improve left index string search performance
- Improve right index array search performance
- Add missing test coverage for index() and rindex()
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
When compiling expressions followed by a unary operator, the compiler
triggered a segmentation fault due to invoking an unset infix parser
routine.
Explicitly handle this case and raise a syntax error if such an
invalid expression is encountered.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
If the read limit passed to fs.readfile() is smaller than BUFSIZ then
disable stdio input buffering to avoid overreading the underlying file.
This is useful when reading small amounts of data from special files
such as /dev/urandom, where a readfile call limited to 16 bytes might
actually read 4096 due to stdio buffering.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
|
|
lib: introduce hexenc() and hexdec()
|