• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Gallopsled / pwntools / 28307443334
74%

Build:
DEFAULT BRANCH: dev
Ran 28 Jun 2026 01:29AM UTC
Jobs 1
Files 152
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

27 Jun 2026 09:42PM UTC coverage: 73.948% (-0.03%) from 73.979%
28307443334

push

github

web-flow
fix: replace bare except with except Exception (#2743)

* fix: improve exception handling in process.py and adb.py

- process.py: restore bare except with pylint disable (intentional: catches
  non-Exception errors during Python interpreter shutdown)
- adb.py: use specific (OSError, EOFError) instead of broad except Exception

* fix: add missing import for remote in adb.py

The bare except was silently catching NameError from the missing
remote import. Added 'from pwnlib.tubes.remote import remote' to
fix the actual underlying bug.

* docs: add changelog entry for PR #2743

* docs: move changelog reference link near 5.0.0 release section

* fix: catch PwnlibException in emulator AVD name lookup

The bare except was catching PwnlibException raised by remote() when
connection fails. Replacing with except (OSError, EOFError) caused
PwnlibException to propagate, potentially causing retry loops in
Android CI.

Fix by adding PwnlibException to the exception tuple.

* fix: prevent __getattr__ infinite recursion with context.device setter

When context.device setter accesses device.arch, it triggers AdbDevice's
__getattr__ (instead of the arch property). __getattr__ then calls
context.local(device=self), which triggers the setter again, causing
infinite recursion.

Fix: check if the attribute exists on the class via MRO.__dict__
before entering the context.local() path. This lets Python's normal
property resolution handle class-defined attributes.

* revert: remove __getattr__ MRO guard

Peace-maker correctly points out that __getattr__ is only called when
normal attribute lookup fails, so the MRO guard is unnecessary.
The infinite recursion is a pre-existing bug unrelated to this PR.

* Assign to `_avd` instead of `avd`

---------

Co-authored-by: mshzy <mshzy@users.noreply.github.com>
Co-authored-by: peace-maker <peacemakerctf@gmail.com>

3951 of 6626 branches covered (59.63%)

4 of 6 new or added lines in 2 files covered. (66.67%)

14 existing lines in 5 files now uncovered.

13619 of 18417 relevant lines covered (73.95%)

0.74 hits per line

Uncovered Changes

Lines Coverage ∆ File
1
70.64
0.31% pwnlib/adb/adb.py
1
73.91
0.0% pwnlib/tubes/process.py

Coverage Regressions

Lines Coverage ∆ File
6
56.64
-1.17% pwnlib/dynelf.py
3
62.5
-7.5% pwnlib/atexception.py
3
75.54
-1.63% pwnlib/memleak.py
1
70.64
0.31% pwnlib/adb/adb.py
1
73.91
0.0% pwnlib/tubes/process.py
Jobs
ID Job ID Ran Files Coverage
1 28307443334.1 28 Jun 2026 01:29AM UTC 152
73.95
GitHub Action Run
Source Files on build 28307443334
  • Tree
  • List 152
  • Changed 7
  • Source Changed 0
  • Coverage Changed 7
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • 09fbd3a6 on github
  • Prev Build on dev (#28238371862)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc