4.1.0 - codename 'antull'
Release Notes
Version: 4.1.0
From: 4.0.0
To: 4.1.0
Commits: 252
Contributors: 40
Authors
- Alex Kornitzer a.kornitzer@me.com
- Anton Kochkov anton.kochkov@gmail.com
- Anton Kochkov xvilka@gmail.com
- Armin Weihbold koyaan@users.noreply.github.com
- David CARLIER devnexen@gmail.com
- Eli elicn@users.noreply.github.com
- F3real stefan92ff@yandex.com
- Florian Märkl info@florianmaerkl.de
- Francesco Tamagni mrmacete@protonmail.ch
- Giovanni 561184+wargio@users.noreply.github.com
- GustavoLCR gugulcr@gmail.com
- Henry Eklind henry@karlek.io
- Jared 1250113+jaredestroud@users.noreply.github.com
- Johannes johannes.brechtmann@gmail.com
- Kamil Lorenc v3l0c1r4pt0r@gmail.com
- Khairul Azhar Kasmiran kazarmy@gmail.com
- Khairul Kasmiran kazarmy@gmail.com
- Kārlis Seņko karlis3p70l1ij@gmail.com
- MNayer 17458834+MNayer@users.noreply.github.com
- MartinJM martinjefmeyers@gmail.com
- Paul I pelijah@users.noreply.github.com
- Qian qwu.au0605@gmail.com
- Riccardo Schirone ret2libc@users.noreply.github.com
- Sergi Àlvarez i Capilla pancake@nowsecure.com
- SjRNMzU SjRNMzU@users.noreply.github.com
- Sylvain Pelissier sylvain.pelissier@gmail.com
- TheGoddessInari thegoddessinari@gmail.com
- Vane11ope vane11opeschw33tz@gmail.com
- condret condr3t@protonmail.com
- dav1901 44604348+dav1901@users.noreply.github.com
- dok 6414482+dokthar@users.noreply.github.com
- erfur erfur@users.noreply.github.com
- fcasal fcasal@users.noreply.github.com
- ilian ilian@tuta.io
- karliss karlis3p70l1ij@gmail.com
- pancake pancake@nopcode.org
- xarkes antide.petit@gmail.com
- yossizap yossizap@gmail.com
- yossizap yossizap@users.noreply.github.com
- Óscar Carrasco oxcabe@gmail.com
Changes
anal
- Improve SP based variable analysis
- Some more helpful messages for anal.verbose
- Fix first r_anal_op call after asm.bits change
- Improve SP based var analysis
- Fix ms cc wrong argument analysis
- Fix r_type_del() for typedefs (Fix #15337)
- Add base64: for afn
- Move the fcn preludes into RAnal and add anal.jmp.tailcall (-1,0,N)
- Fix typo in ios-syscalls.txt (#15436)
- Initial implementation of afvf - show bp-relative stackvars
- Insert arguments into types SDB on function analysis
arch
- Add support for or1k (OpenRISC) disasm+analysis (#15515)
asm
- Fix ignored asm.bits settings because of RBin overrides
- Fix for #15459 - Also set the first operant to the right value on a mov from pointer with offset
- Add ARM strd support (#15388)
bin
- Add 64-bit iOS SEP xtr plugin
- Add PIE flag check in kernelcache detection
- bin.str.enc: Accept UTF hyphen aliases (#15492)
- Support UTF32-BE decoding (#15472)
- Recognize Unicode BOMs (#15469)
- Use pj in the izj and izzj commands
- Fix #15445 - Add support for Mach-O external relocs
- Add support for C64 PRG fileformat
- pd: Don't abort string printing on initial null if bin.str.enc != guess (#15446)
- Fix #14279 - Ignore entrypoint on non-executable ELFs
- Analyse HIOS and LOOS symbol types by default. (#15411)
build
- Fix #15485 - Improve argument parsing in sys/{install,build} (#15486)
- FIx 32bit windows
- Rename "asan" to "sanitize" (#15412)
- Fix build for 32bit Linux systems
- Fix build of the onefied shared lib
command
- Very simple tree sitter integration (#15414)
config
- Pass R2_CONFIG file to ! commands and serialize methods
cons
- Fix #14197 - Don't highlight control chars on hud filter (#15552)
- Include last line when greping using foo~n.. (#15524)
core
- Fix some Race Conditions with the thready task scheduler (#15667)
- Make Task Scheduling Explicit (#15511)
- asm.cmt.off: Accept 0 & 1 as aliases for false & true respectively (#15500)
- Use sigaction instead of signal
- CPU affinity API introduction
- Honor cfg.editor in 'vi' instead of always using 'vi'
- Implement $foo:=,+=,-= and $foo to alias some flags commands
- Support 'f foo+=4' and 'f foo-=4' syntax for flags
debug
- Improve debug rebasing and fix partial windows rebase
- Refactor debug native's wait function
- Fix native debug not working with files that were opened as RW
-
- Add ppid to win32 debug and 'dp''s display/json
-
- Add process selection to w32 debug
- Fixed a crash caused by reopening gdb
- Fixed not killing child processes and added detach
- Fixed gdbr warnings and a dpt crash after debug was over
- Added an event to signal the end of the debug session
- Fix 'oo' rebasing when leaving debug and add 'doc' to exit
- Silence drr warning on UT64_MAX registers
- Fixed an issue with detached child breakpoint inheretence
- Added oodf\doof to enable rebasing for remote debug
- Rebase Breakpoints for PIEs
- Added
dp
processes info support to gdbr - Add breaking to
ood
in linux to avoid execvp freezing - Allow debug plugins to modify pid/tid on select
- Fix linux_set_options error
- Add process selection to linux native debug
- Setting parent pid on pid list on BSD
- Show all processes for pid 0 using dp
- Improve linux native debug
dp
output - Fix getting DRX breakpoint size
- Fixed overflow that broke remote debugger reopening
- Impl. list modules for WinDbg
- Fix WinDbg IO in page boundaries
- Fixed windbg concurrency and added missing locks
- Fixed windbg pipe timeout behavior on linux
- Added rebuild rules for windbg
- Fixed windbg continue on windows 7 64bit
- Allow breaking for WinDbg
- Update hardcoded gdbr registers for 16/32bit x86 (#15488)
- Added parsing support to all gdb registers
- Fix gdbr's reg_write and reg_next_diff for reverse stepping
- Reduced gdbr's tcp connect timeout and added a break
- Fix gdbr not closing sockets after connect failed
- Add break to gdbr's read_packet and move isbreaked to libgdbr
- Fix gdbr_write_registers and refactor gdbr_write_reg
- Replaced lock_check with tryenter in gdbr_read_registers
- Add breaking to gdbr connect to avoid waiting on invalid connections (#15442)
- Add experimental ymm regs support for linux-x64 and extend drm command
- Add Windows 8 and 8.1 WinDbg profiles
- Fix attaching to a pid on Windows (#15406)
- Fixed w32dbg breaking issues (#15386)
- Add support for printing xmm* as packed floats and doubles (#15378)
disasm
- Fix hidden hint.lea for hint.pos==0
- Improve switch-statements in disassembly
- Add refs, xrefs and esil columns to pdt
- Add asm.cmt.esil to show ESIL as comment
doc
gdbclient
- gdbclient reduces risk of use after free down the road
io
- Uses the setitimer api instead for the alarm in self://
- Automatically set the debug plugin when opening debug uris (#15403)
json
- Add current process field to dpj
network
- Fix r_socket_connect not using the given timeout in unix
- Fix #14661 - Support parsing binary protobuf data (#15423)
- Add utf-8 support in r_print_rangebar (#15389)
r_debug
- Refactor signal handling for FreeBSD
search
- Introduce the r_magic_load_buffer() api and boolify a bit
- Update RSA key search to find larger keys (#15494)
- Search for AES 128, 192 and 256-bit keys (#15426)
signatures
- Add auto zignspace generation for the zg command (#15402)
test
- Implement asm, fuzz and json test runner in r2r.v
util
- Add RIntervalTree data structure
- Added r_th_lock_tryenter API (#15454)
- Use HtPP for RStrConstPool (#15424)
visual
- Improve the interaction with decompilers in panels
- Reduce the blocksize on some hexvisual modes
windows
- Add command to identify window under cursor
- Fix #15456 - Fix reopening in write mode
- Fix hang when running dc in a task
To Review
- Release 4.1.0 - Codename 'antull'
- Fix lock ordering of RCoreTaskScheduler.lock vs. RCoreTask.dispatch_lock
- Remove RThreadLock.refs
- Fix a race in tasks
- Make SP based variable analysis aware of changes to SP
- Use delta inside stack to identify the variable used instead of offset to SP
- Keep track of offsets to SP used to access the variable
- Fix argument printing order for reg args
- Add test
- Revert pe coverity fixes to fix ihj
- The format is reused for printing and internal type representation,
- breaking the JSON by making the value field in ihj empty since "llx"
- isn't a valid type
- Fix ESIL UB
- Mark fixed tests as such
- Fix some FX Tests
- Separate windows, linux and *bsd/apple since they have vastly different
- logic and the ifdef jungle implementation was too confusing
- sys/meson.py: Use == 'vs2017' instead
- The FD was kept open and ptrace was prevented from opening it with the
- error "Could not execvp: Text file busy". Fixes issue #15650.
- Solving r_debug_handle_signals build warning issue.
- Fix #15653: Silence MSVC XP deprecation warning
- Use eprintf instead
- Fix typo
- Make it possible to use sysmagic again (#15658)
- Compile tree-sitter with std=c99 flag (#15654)
- SystemZ analysis logic error
- Fix some MSVC warnings
- Add ppid to dp and fix dp= for windows (#15649)
- Previously,
dp=
wouldn't fully switch to the given process since it - was treated like
dpt
thread switching, leaving the debugger in - an undefined state.
- Function r_anal_cc_arg should just return NULL when nothing is available (#15646)
- Function r_anal_cc_arg should just return NULL when nothing is available
- Callers should be able to handle NULLs
- Fix memory leaks in unit tests
- Some coverity fixes (#15643)
- The plugin would try to work with an old version of desc that was already
- freed by r_io_close_all after closing the session. I set debug_gdb's
- global 'desc' to NULL in detach as a temporary solution. We should convert
- to **desc to keep an updated copy of the pointer.
- Fix warnings in or1k_disas.c
- Fix #15545 - Fix NULL derefs after r_file_slurp() fails
- Fix format string in windows_message.c
- Replace some strstr() calls with strchr()
- Fix Alignment Check in aae on bit change
- RDebugPid not being initialized with NULL resulted in a free on an invalid
- pointer after gdbr_threads_list failed.
- Fix memleak in r_anal_free() (#15631)
- Fix heap-buffer-overflow bug in get_src_regname() (#15630)
- r2r.v: Fix test skipping (#15629)
- r2r.v: Move threads into r2r (#15628)
- Some Coverity defect fixes (#15626)
- Not all of the data was rebased after reopening the original file and
- there was warning message from set_baddr which isn't needed here.
- Switched to __rebase_everything instead of the old methods that were used.
- r2r.v: Support running of just 1 cmd testfile (#15616)
- r2r.v: Fix invocation of json tests (#15624)
- Fix AppVeyor (#15623)
- Refix magic's bgets()
- Fix another infite loop in RMagic.loadBuffer()
- Fix bread in RMagic.loadBuffer()
- Loading json tests is not the same as running them (#15618)
- In this way 64-bit SEP kernels aren’t wrongly detected as XNU kernel caches.
- Rename or1k
insns
global (#15613) - As in certain build configurations it conflicts with the Capstone’s symbol of the same name, raising errors in the linking phase.
- The warning:
- WARNING: r_core_anal_hasrefs_to_depth: assertion 'core && value != UT64_MAX'
- failed (line 2062)
- This way registers like 'orax' will simply have an empty reference like before,
- just without an annoying warning when there really is nothing to telescope.
- {"reg":"orax","value":"0xffffffffffffffff","ref":""}
- Use ONE_STREAM=1 instead and assume it sets scr.onestream
- Name variables based on their offset from the start of the stack frame
- Fix tests
- Fully implement the asm test runner in r2r.v
-
- Must use the native api to speedup
-
- TODO: Multiple cores to run in parallel
- Fix N and V results in 6502 BIT ESIL (#15562)
- r2r.v - better portability
- Fix some more asm tests and use the same warning style for r2r.v
- Fix crash on oom when command line is too long. Aim to fix #15543
- Initial implementation of the asm/dis tests support in the V suite
- Remove broken Threading Code from main for #12996 (#15554)
- Previously, forked children would instantly die if the fork was stepped
- over using a breakpoint which is accessible to the child process.
- Removed deprecation messages (#15557)
- Moved the information in the help messages
- Add RRangeTree
- Inclusive/Exclusive
- Add r_interval_tree_delete and r_interval_tree_resize
- Fix r_interval_tree_all_at()
- Fix a bug of the tab (#15559)
- Imports Tests from radare2-regressions (#15546)
- Fix some warnings (#15549)
- Fix signed integer overflow in r_asm_massemble (#15551)
- Fix an int Overflow in r_asm_massemble() for #15543
- Fix length type in r_str_trim_tail()
- Aim to fix another integer overflow in r_file_slurp
- Fix integer overflow when assembling a 2GB file
- Blindfix for #15543 - aka CVE-2019-19590
- Most servers/clients should have xml support by now so it should behave
- like
dp
in any other debugger. vFile is the only way to get detailed pid info unfortunately. - Execvp may hang until a signal is received on some systems(reproduced in
- arch linux) in case the file can't be executed for some reason(broken
- symlink, different arch, etc).
- Previously, when using
dp=
, the debug plugin would set a new tid based - on the requested pid, but r_debug_select would set the old tid as dbg->tid,
- resulting in issues interacting with the current thread. This could also
- be an issue when the requested pid/tid is invalid and the plugin selects
- something else.
- Previously, setting options would fail sometimes since PT_ATTACH's attach
- SIGSTOP wasn't hit before reaching linux_set_options.
- Previously,
dp=
wouldn't fully switch to the given process since it was - treated like
dpt
thread switching, leaving the debugger in an undefined state. - Add user Pointer to RBNodeFree (#15540)
- Fix sj current position marker after buffer wrapping. (#15538)
- Coverity Scan GitHub Action (#15539)
- ONE_STREAM_HACK & scr.onestream: Force expected ONE_STREAM order if necessary (#15535)
- Fix spp warning (#15530)
- Try showing offset when there are no redo items.
- Fix handling of many seek history items and other edge cases.
- Previously, the command didn't show the pid's path, replaced the path
- field with current/ppid, and showed the ppid instead of only showing the
- requested process and the children of the requested process.
- Fix some warnings on Windows (#15532)
- opt->sz is initialized with r_buf_size at r_bin_open_io using an io
- buffer if r_bin_open_io can't open a file buffer. Since the debuggers
- returned unsigned values to opt->sz which is signed, opt->sz would
- overflow and contain a negative value, causing r_bin_open_buf to fail.
- Went ahead and modified CUR_END values for all debuggers even though this
- should only affect remote debuggers. ST64_MAX should be enough.
- Python and VS updates for Windows/clang (#15526)
- Python and VS updates for Windows/clang
- Fix labeler environment
- windbg module build warning fix (#15514)
- Switch labeler to periodic-labeler (#15517)
- With actions/labeler#12
- being an issue, the action's labeler is useless for PRs that come from a fork.
- This one runs on a cron timer instead and doesn't suffer from the same issue.
- fixed bin.libs loads and dex use after free (#15522)
- Fix a Double Free for Dex (Fix #15519) (#15521)
- Add Comments to RCore and kill some unused Members (#15513)
- Fix #15498 - Fix stdcall stack calling convention (#15508)
- Remove unnecessary RConfig Members (#15509)
- Fix a Double Free in tms320/c55x+ (#15505)
- Before we didn't check if a virtual address read/write would go through a page boundary. This fixes it.
- Also do some formatting and re-enable some useful error messages
- Fix XP build
- Partially decouple Tasks from RCore
- Add pull request labeler (#15503)
- Previously, windbg_break would freeze waiting on a lock instead of breaking,
- taks other than wait weren't breakable and read regs would freeze the
- process while waiting for a mutex.
- Previously, linux would timeout when trying to connect and would timeout
- too frequently since milliseconds were treated as microseconds.
- ContinueApi2 only worked on XP 32bit while ContinueApi works on both.
- Previously, continue would do a single step.
- Fix OOB read in windbg_reg_read
- Add locks to prevent collision
- Enable timeouts on the pipe backend
- Fix #15495 - show current seek history position in
sj
- bin.str.enc: Accept uppercase aliases (#15496)
- bin.str.enc: Check for NULL (#15493)
- Fix anal.timeout calculation in r_cons_break_timeout (#15490)
- Remove broken Task Pausing and unnecessary RCore.lock (#15489)
- Fix null deref when using waf on non-valid file
- Inital GitHub Actions (#15467)
- Inital GitHub Actions
- Disable Windows for now
- Disable tests for now
- Add missing BT instruction optype for x86
- There are still platforms that don't support the target xml format.
- Added parsing of gdbr arm/arm64 register features and added a default to >64bit registers
- Since r2 doesn't support set/get to large/vector registers (it will still work
- when printing gdb's registers with dr/drt or restoring the registers
- with reverse stepping), there's a possible issue that the user will get
- lots of prints of "r_reg_[get/set]_value: Bit size 128 not supported"
- when running various debug commands that use those functions. This fix
- simply moves those registers away from gpr to avoid those prints while
- still being able to view/restore the registers.
- Minor Refactoring and Comments for RBTree
- Fix the flags.prefix with flags.inline glitch
- The previous implementation was limited to 64bit registers and didn't
- parse the 'feature' field.
- Writing registers with gdbr worked with single registers because
- reg_next_diff started at delta 0 and only had to run the diff once for
- the single register that was changed. When running reverse
- stepping/continue, multiple registers are changed at once so
- r_reg_next_diff would fail every time due to incorrect offset calculation.
- The new r_reg_next_diff also support different register sizes to restore
- all registers correctly.
- The endianity swapping part from reg_write isn't needed since the arena
- is the return value of 'g' which is already in the correct target byte
- order (see: https://sourceware.org/gdb/onlinedocs/gdb/Packets.html#read-registers-packet)
- Fix #15451 - Update Windows compilation documentation
- Connect isn't effected by r_socket_block_time since it can only change the
- timeout of read(and not implemented, write) actions with setsockopt.
- Also, connect may wait for an unspecified amount of time so we have to use
- select.
- The socket object was free'd without closing the fd. In the following
- gdbr_connect attempts, tcp's connect would freeze on a valid socket since
- connection based protocol sockets may successfully connect only once,
- any connections beyond that are undefined behavior.
- Remove printf debug leftover
- Some fixew for the graphviz code (#15470)
- Add TODO comment for overlong strings
- No more hacky base64
- iz != izz, before izz was iz+izz
- Fix x86 lahf instruction
- Fix autocomplete
- Don't contribute with patches
- Emit sp-based var offset as a number
- The output of
afvsj
shows offsets of sp-based variables as strings. - This fix changes the offset to be shown as a number, just like sp-based arguments and bp-based variables.
- Since read_packet has a large number of retries you would wait for it
- for a couple of seconds after breaking in functions like connect and
- vcont
- Previously, write_registers sent a partial string instead of the
- correct register format which specifies that each byte should be
- represented by two hex digits.
- This change allows reading registers when calling read_registers in
- a thread that holds the recursive mutex.
- r_th_lock_check only returns the refcount which isn't enough to know if
- the current thread is holding the mutex when a recursive mutex is enabled.
- Support UTF16-BE decoding (#15450)
- Support UTF16-BE decoding
- Add spaces
- Fix few warnings for the gdb client
- Fix crash
- Cleanup tab-completion initialization code
- R2 will hang while waiting for any resolvable port to respond, this takes
- a long while since connect is attempted twice in r_core_file_open.
- Update capstone v4/next from Git
- Added break to gdbserver vCont and refactored the code to use locks (#15433)
- The previous gdbr implementation didn't allow interrupting background
- tasks with &b since send_vcon wasn't properly configured with the cons
- api. In addition to that, gdbserver doesn't support processing multiple
- commands at the same time, resulting in undefined behavior once cons
- were set up for vcont.
- This commit adds the relevant cons api and solves the concurrency issues
- by adding locks on all socket related logic.
- Fix r_sys_sigaction not setting up the requested signals (#15440)
- The for loop's iterator was initialized with the first member of sig[]
- instead of 0. Added an error to avoid this issue going unnoticed.
- r_list_free() -> r_list_free ()
- r_list_new() -> r_list_new ()
- __exit was listed twice with same number (1), and fork was missing.
- Fix broken pkg uninstall command on macOS (#15437)
- Provide a proper package ID to get rid of the following error:
No receipt for 'radare2.pkg' found at '/'.
- Prepend a
/
for each returned path by thepkgutil
command, to make - it an absolute path instead of a relative one.
- Avoid invoking the
sudo
command for each file, which speeds up the - command significantly.
- Avoid ambiguous signing certificates on macOS.
- If a user manually installed a new code signing certificate into the
- login keychain as documented, the install script will fail to sign r2
- because the
sys/macos-cert.sh
script generates a new certificate in - the System keychain. This results in the following error when signing:
-
- org.radare.radare2: ambiguous (matches "org.radare.radare2" in /Users/user/Library/Keychains/login.keychain-db and "org.radare.radare2" in /Library/Keychains/System.keychain)
-
- To be constistent with
sys/macos-cert.sh
, change manual certificate - generation steps to install to System keychain instead of login
- keychain.
- Mention that code signing certificate generation is automated by the
- install script before listing the manual steps to generate a new
- code signing certificate.
- r_list_newf(..) -> r_list_newf (..)
- Use free() instead of R_FREE() in r_list_delete()
- Same reason as #15430.
- Use PJ in oj (#15434)
- This fixes escaping issues
- Fix Leak of Flag Zones (#15432)
- Use free() instead of R_FREE() in r_list_free() (#15430)
- Refactor r_flag_color() to r_flag_item_set_color() (#15429)
- Add r_spaces_purge() (#15428)
- Fix comment about RFlag.ht_name (#15427)
- Faster interactions -- can be improved still
- Add missing entry for meson
- Fix r_strbuf dependency on r_cons
- This allows the 'zg' command to auto generate zignspaces from function
- names by utilising the ':' convention used in zignatures. Now when 'zg' is
- run if any funtion names are in the format ZIGNSPACE:FUNCTION, the
- zignspace will be extracted, created and the function applied under its
- scope.
- Fix build (#15422)
- Fix #15419 - Fix bytes field in aoj
- Hold this analop warning under anal.verbose
- tree-sitter-integration: support tmp-seek, arged, and interpret commands
- Make meson automatically download tree-sitter and radare2-shell-parser grammar
- Add tree-sitter/radare2-shell-parser directories in gitignore
- Add Support for tree-sitter in acr/makefile
- Just use one script to download 3rd party repositories in shlr
- Use cfg.newshell
- Fixes for Windows debugging (#15418)
- Fix error when continuing after attaching to process
- Get threads correct EIP
- Fix some memory corruptions and small refactor
- Remove core->oobi because not used (#15413)
- Fix leaddrs leak (#15417)
- $foo:=123 f foo = 123
- $foo+=4 f foo @ foo + 4
- $foo s foo
- Strip bins and libs for the Debian package
- sys/meson.py: --asan accepts sanitizer list (#15405)
- Fix #15407 - Fix using unexpected ACP for input on Windows (#15408)
- Fill op->mnemonic in anal-gb
- Use RPUSH in anal-gb
- Clarifying yara-to-r2 integration documentation. (#15404)
- Sync default sanitizer list of sys/asan.sh and sys/meson.py (#15397)
- Sync default sanitizer list of sys/asan.sh and sys/meson.py
- Keep signed-integer-overflow
- Hardening esil-dfg
- Modified debug_native to handle break's thread switching behavior
- The user was interrupted during continue and switched to a different
- thread since DebugBreakProcess creates a thread that triggers a breakpoint.
- With these changes the DebugBreak thread is recorded to skip the breakpoint
- event afterwards.
- Modified r_debug_native_wait to avoid switching between threads for each event
- The debugger should return to the requested thread after handling events
- in other threads except for breakpoints.
- Refactor
drm
to be ready for the YMM registers (#15394) - Fix Appveyor hang. (#15396)
- fix linux x86 build (#15395)
- Fix assert
- Fix build
- After release version bump
- Add some asserts in rreg
- Fixed w32dbg breaking issues and moved break_push to w32_dbg_wait to support stepping as well
- Previously, breaking would only work during 'dc' because it was pushed
- in debug.c specifically for continue. This change moves the
- responsibility of pushing/popping w32_break_process_wrapper to
- windows_debug.c instead to support calls to w32_dbg_wait from anywhere.
- sys/meson.py: Use -fsanitize=... instead of -lasan when linking (#15390)
- Use pj api in drrj (#15391)
- This also solves an issue with drrj in windows since the code relied
- on iter->p to know if a comma should be prepended, but windows always
- has it initialized so it was always prepended - invalidating the JSON.
- Make the generated r2.bat use bat path_relative syntax instead of hardcoding. (#15383)
- Fix double-free in canvas.c (#15379)
- stack.nl is no longer active