Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

common/json_parse: json_to_bitcoin_amount fails to detect overflow and accepts negative/empty inputs

Đang mở Phù hợp với người mới
#9,617 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 2 ngày

@bhuvan-somisetty đang làm issue này rồi.

Từ ngày 10/10/2026.

  • #9618 của @bhuvan-somisetty — đang mở

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
62/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
c
Lĩnh vực
backend

Hướng nghiên cứu

Lỗi nằm ở json_to_bitcoin_amount() trong common/json_parse.c, nơi kiểm tra tràn so sánh cùng một biểu thức đã bị wrap với chính nó, và việc phân tích số chấp nhận dấu '-' ở đầu cùng các token rỗng. Hãy bắt đầu bằng việc đọc hàm đó và lệnh gọi strtoul, sau đó tìm các test json_parse hiện có và thêm ba đầu vào đã được báo cáo làm test case. Hoàn thành khi cả ba đều trả về false và các số tiền hợp lệ vẫn được phân tích đúng.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Issue and Steps to Reproduce

json_to_bitcoin_amount() in common/json_parse.c has multiple parsing and overflow validation flaws:

  1. Tautological overflow check:

    *satoshi = btc * (uint64_t)100000000 + sat;
    if (*satoshi != btc * (uint64_t)100000000 + sat)
        return false;
    

    Both sides of *satoshi != btc * (uint64_t)100000000 + sat evaluate the exact same uint64_t wrapped value after an overflow. When btc is large (e.g. 184467440738), btc * 100000000 overflows uint64_t and wraps around, but the check evaluates wrapped_val != wrapped_val (which is false), returning true with a corrupted satoshi value.

  2. Negative numbers & signs accepted:
    strtoul accepts leading '-' and converts negative values (such as "-1.00000000" or "-0.00000001") into large unsigned values (e.g. ULONG_MAX), wrapping around during multiplication and returning true.

  3. Empty tokens:
    An empty token (tok->start == tok->end) is parsed as 0 satoshis and returns true instead of returning false.

Steps to reproduce

Call json_to_bitcoin_amount() with:

  • "184467440738.00000000": returns true with wrapped amount 90448385 instead of false.
  • "-1.00000000": returns true with corrupted amount instead of false.
  • "": returns true with 0 satoshis instead of false.
getinfo output

N/A (C unit parsing logic in common/json_parse.c)

Ngôn ngữ chính
C
Star
3.1k
Fork
1k
Merge trung bình
3 ngày 6 giờ
Pull request đã merge (30 ngày)
41

Chuẩn bị môi trường

  • Có Dockerfile hoặc tệp Docker Compose
  • Có mẫu pull request
  • Không có hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của ElementsProject/lightning

Tất cả issue của ElementsProject/lightning

Issue tương tự

Thêm issue về C

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.