name: Check Update Default Stack Size on: push: paths: - "orchestration/increase_default_stack_size.sh" pull_request: workflow_dispatch: # Also run weekly to ensure this doesn't inadvertently decay schedule: - cron: "0 0 * * 1" jobs: stack_size: strategy: matrix: os: [ubuntu-latest, ubuntu-24.04, ubuntu-22.04, macos-15-intel, macos-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 6.0.0 - name: Install Go uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # 6.1.0 with: go-version: stable - name: Monero Daemon Cache id: cache-monerod uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # 4.2.4 with: path: monerod key: stack-size-monerod - name: Download the Monero Daemon if: steps.cache-monerod.outputs.cache-hit != 'true' run: | # We explicitly download the Linux binary as this script executes over an ELF binary wget https://downloads.getmonero.org/cli/monero-linux-x64-v0.18.4.4.tar.bz2 tar -xvf monero-linux-x64-v0.18.4.4.tar.bz2 mv $(find . -name monerod) . - name: Verify expected behavior shell: bash run: | STACK=$((8 * 1024 * 1024)) OS=${{ runner.os }} if [ "$OS" = "Linux" ]; then sudo apt update -y sudo apt install -y ksh bash dash zsh busybox posh mksh yash sudo ln -s "$(which busybox)" /usr/bin/ash sudo ln -s "$(which busybox)" /usr/bin/hush wget http://ftp.us.debian.org/debian/pool/main/g/gash/gash_0.3.1-1_amd64.deb sudo apt install ./gash_0.3.1-1_amd64.deb SHELLS="sh ksh bash dash zsh ash hush posh mksh lksh gash yash" fi # macOS has the benefit of packaging `oksh`, `osh`, and having distinct core tools if [ "$OS" = "macOS" ]; then brew install ksh93 bash dash-shell zsh mksh oksh yash oils-for-unix SHELLS="sh ksh bash dash zsh mksh oksh yash osh" fi # Install shells available via `cargo` cargo install brush-shell SHELLS="$SHELLS brush" # Install shells available via `go` GOBIN=$(pwd) go install github.com/u-root/u-root/cmds/core/gosh@latest mv ./gosh /usr/bin SHELLS="$SHELLS gosh" # Patch with `muslstack` cp monerod monerod-muslstack GOBIN=$(pwd) go install github.com/yaegashi/muslstack@d19cc5866abce3ca59dfc1666df7cc97097d0933 ./muslstack -s "$STACK" ./monerod-muslstack # Patch with `chelf`, which only works on a Linux host if [ "$OS" = "Linux" ]; then cp monerod monerod-chelf git clone https://github.com/Gottox/chelf cd chelf git checkout b2994186cea7b7d61a588fd06c1cc1ae75bcc21a make ./chelf -s "$STACK" ../monerod-chelf cd .. fi # Run our script with all installed shells for shell in $SHELLS; do echo "Executing $shell" cp monerod monerod-idss-$shell ln -s "$(which $shell)" sh ./sh ./orchestration/increase_default_stack_size.sh monerod-idss-$shell rm ./sh done # Verify they all had the same result sha256() { sha256sum "$1" | cut -d' ' -f1 } CHELF=$(sha256 monerod-muslstack) find . -name "monerod-*" | while read -r bin; do BIN=$(sha256 "$bin") if [ ! "$CHELF" = "$BIN" ]; then echo "Different artifact between monerod-muslstack ($CHELF) and $bin ($BIN)" exit 1 fi done # Verify the integrity of the result read_stack() { STACK_INFO=$(readelf "$1" -l | grep STACK -A1) MEMSZ=$(printf "%s\n" "$STACK_INFO" | tail -n1 | sed -E s/^[[:space:]]*//g | cut -f2 -d' ') printf "%i" $((MEMSZ)) } INITIAL_STACK=$(read_stack monerod) if [ "$INITIAL_STACK" -ne "0" ]; then echo "Initial \`PT_GNU_STACK\` wasn't 0" exit 2 fi UPDATED_STACK=$(read_stack monerod-muslstack) if [ "$UPDATED_STACK" -ne "$STACK" ]; then echo "Updated \`PT_GNU_STACK\` ($UPDATED_STACK) wasn't 8 MB ($STACK)" exit 3 fi # Only one byte should be different due to the bit pattern of 8 MB BYTES_DIFFERENT=$(cmp -l monerod monerod-muslstack | wc -l || true) if [ "$BYTES_DIFFERENT" -ne 1 ]; then echo "More than one byte was different between the two binaries" exit 4 fi