2012-06-27 24 views
6

Thật đơn giản để tạo lỗi ghi trong bộ kiểm tra bằng cách viết thư tới /dev/full. Có một kỹ thuật tốt để tạo ra một lỗi đọc? Tôi hiện đang sử dụng LD_PRELOAD để ghi đè lên read nhưng điều đó có vẻ quá phức tạp và không di động (không phải là/dev/full là di động ...).Tạo lỗi đọc

+0

Chỉ là một suy nghĩ, nhưng những gì về đọc từ một tập tin với perms thiết lập để 000? –

+0

@Loadmaster Điều đó sẽ gây ra lỗi 'mở' thay vì lỗi' đọc'. –

+0

Bạn có sau EINVAL không? – jpe

Trả lời

5

Bên cạnh đọc từ một thư mục (như đã đề cập trong một câu trả lời trước), bạn có thể cố gắng đọc /proc/self/mem để nhận được một lỗi (điều này sẽ giúp bạn có một EIO trên Linux). Để được giải thích, vui lòng xem: https://unix.stackexchange.com/a/6302

+0

Mẹo hay, nhưng hãy cẩn thận rằng '/ proc/self/mem' chỉ tốt nếu bạn đọc từ đầu tệp. Nếu chương trình tìm kiếm đầu tiên, nó có thể vô tình kết thúc trong một vùng được ánh xạ. – Gilles

2

Theo (OS X) đọc (2) manpage, đọc (2) sẽ tạo ra lỗi nếu "[a] n cố gắng được thực hiện để đọc một thư mục." Do đó bạn có thể mở (2) một thư mục (đảm bảo rằng các prot không cho phép viết, hoặc điều này sẽ ném một lỗi) và sau đó cố gắng đọc từ nó. Điều đó trông giống như lỗi duy nhất được liệt kê ở đó có thể xảy ra trong các trường hợp 'bình thường' (nghĩa là không làm điều gì đó như cố ý phá vỡ một cấu trúc FILE *).

Tôi giả sử bạn đang nói về lỗi đọc (2) trong C hoặc giống như vậy, nhưng ngay cả trong ngôn ngữ cấp cao hơn, bạn có thể mở thư mục và cố gắng đọc từ đó (mặc dù Tôi chỉ thử nó với Python, và nó quá thông minh để cho phép bạn mở thư mục ...)

1

Bạn cũng có thể vượt qua một con trỏ bất hợp pháp như bộ đệm để đọc, mà sẽ trả về một -EFAULT. Cái gì như:

read(fd, (char *)0, cout); 

Cảm ơn Suzuki

+0

Điều đó sẽ không tạo ra lỗi đọc (EINVAL), nhưng bộ đệm nằm ngoài vùng địa chỉ có thể truy cập của bạn (EFAULT) trong khi đọc. Nhưng theo người đàn ông 2 đọc nó sẽ có thể để có được EINVAL với sửa đổi nhỏ. Nhưng điểm trong câu hỏi có vẻ là "làm thế nào để có được EINVAL mà không sửa đổi mã nhưng sản xuất một wrapper mà sẽ thi đua tất cả các tình huống lỗi thú vị". – jpe

+0

Thực tế mã không nên sửa đổi và quá trình này phải mở thành công một tệp, thực hiện nhiều thao tác I/O (cả đọc và ghi) nhưng sau đó một số thao tác đọc tiếp theo sẽ được thực hiện để không thành công. Điều này có thể thực hiện được bằng cách ghi đè đọc và thực hiện một bộ đếm đơn giản để hoạt động đọc Nth thất bại, nhưng sẽ tốt hơn nếu làm điều gì đó từ một kịch bản lệnh shell tương tự như: 'kill -STOP $ pid; chmod 000 tập tin; kill -CONT $ pid'.Một phương pháp để nhận được một lỗi ghi trong điều kiện tương tự sẽ được tốt đẹp, như văn bản cho/dev/đầy thất bại trên ghi đầu tiên. –

4

Phương pháp hoạt động trên tất cả các thông báo chính sẽ là triển khai hệ thống tệp nhỏ FUSE. EIO là mã lỗi mặc định khi trình điều khiển hệ thống tệp của người dùng của bạn làm điều gì đó sai, do đó dễ dàng đạt được. Cả hai liên kết PerlPython đều có các ví dụ để bắt đầu, bạn có thể nhanh chóng viết hệ thống tệp chủ yếu phản ánh các tệp hiện có nhưng tiêm một EIO ở những nơi được lựa chọn cẩn thận.

Có hệ thống tệp hiện có như vậy: petardfs (article), tôi không biết nó hoạt động tốt như thế nào.

+0

Ồ, +1: petardfs rõ ràng là điều phải làm. –

Các vấn đề liên quan