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

Potential integer overflow when using atoi() In cgi-bin/var.c

Đang mở Phù hợp với người mới
#1,748 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 1 ngày

@lynayur đang làm issue này rồi.

Từ ngày 8/10/2026.

  • #1749 của @lynayur — đang mở
  • #1784 của @JWWTSL — đ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
76/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

Bắt đầu với đoạn mã phân tích hậu tố trong cgi-bin/var.c quanh các dòng 990-992, nơi atoi() chuyển số sau dấu - cuối cùng thành chỉ số mảng, rồi kiểm tra phép thử phạm vi trong cgiSetArray() gần dòng 459. Thay các lệnh gọi atoi() bằng strtol(), đặt lại errno trước khi gọi, và từ chối các giá trị mà errno là ERANGE hoặc kết quả nằm ngoài phạm vi chỉ số được chấp nhận, trước khi ép kiểu sang int. Hoàn thành khi không còn atoi() nào trên đường xử lý này và các hậu tố ngoài phạm vi bị từ chối trước mọi phép chuyển đổi.

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

Mô tả

Potential problem

In cgi-bin/var.c, the numeric suffix of a form field name (the part after the last -) is converted with atoi() and used as an array index:

https://github.com/OpenPrinting/cups/blob/0420526915c79d18e643e0fd7b2ce555bb5bbd63/cgi-bin/var.c#L990-L992

If the value exceeds INT_MAX, converting it with atoi() results in undefined behavior. The subsequent atoi(ptr) - 1 may also overflow.

The practical impact appears limited because cgiSetArray() rejects indexes outside the 0..100000 range:

https://github.com/OpenPrinting/cups/blob/0420526915c79d18e643e0fd7b2ce555bb5bbd63/cgi-bin/var.c#L459

However, this check is performed only after atoi() has already processed the input, so it cannot make the conversion itself safe. Since the behavior of an out-of-range atoi() conversion is undefined, the result cannot be reliably validated by the subsequent range check and could potentially fall within the accepted range.

Possible solution

Replace atoi() with strtol(), reset errno before the conversion, and validate both errno != ERANGE and the parsed value against the expected range before converting it to int.

Found by Linux Verification Center (portal.linuxtesting.ru) with SVACE.
Author: Stanislav Pichugin <[email protected]>.

Ngôn ngữ chính
C
Star
1.8k
Fork
352
Merge trung bình
2 ngày 5 giờ
Pull request đã merge (30 ngày)
14

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

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 OpenPrinting/cups

Tất cả issue của OpenPrinting/cups

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.