Read или lseek странно работают в программе notesearch.c, программа не печатает заметки
Эй все, я читаю книгу Джона Эриксона "искусство эксплуатации", и там есть программа, которая не работает, и даже после отладки и тестирования нескольких вещей я, кажется, не могу найти решение...
Эта программа должна искать заметки, сделанные с помощью другой программы, notetaker, в файле по адресу /var/notes. Дело в том, что он не печатает заметку, а только [DEBUG] линия говорит, что он нашел записку... Вот код souce, он документирован и довольно прост для понимания:
https://github.com/florian-pjde/Art_of_exploitation/blob/master/notesearch_debug.c
Вот ожидаемый результат от книги:
reader@hacking:~/booksrc $ ./notesearch [DEBUG] found a 34 byte note for user id 999 this is a test of multiuser notes -------[ end of note data ]-------
и что я получаю:
florian@parrot:~/Documents/Art_of_Exploitation/book_code $ ./notesearch [DEBUG] found a 34 byte note for user id 1000 -------[ end of note data ]-------
Проблема в том, что note_buffer пуст, так что, очевидно, печатать нечего, похоже, исходит из любой из этих двух строк:
read(fd, note_buffer, note_length);(строка 45)
fd-это идентификатор файла для /var/notes, note_buffer-массив символов длиной 100, а note_length-реальная длина заметки, что корректно выполняется другой функцией. Таким образом, вполне возможно, что read ничего не записывает из файла в note_buffer. Или,
lseek(fd, length * -1, SEEK_CUR); // rewind file reading by length bytes(строка 77)
fd снова является идентификатором файла, length-длиной заметки (мы находимся в другой функции), а SEEK_CUR перематывается с текущей позиции из того, что я понял. Возможно, он не перематывается правильно, поэтому чтение не работает.
Что я уже пробовал:
Я поместил несколько строк [DEBUG] в программу и снова скомпилировал, кажется, длина правильная, но note_buffer равен нулю, поэтому либо он не читает файл в нее, либо lseek не перематывает правильно, чтобы он читал нужное место, я не вижу другого способа... Вот вывод программы с дополнительными строками [DEBUG] :
[DEBUG] length is 34 [DEBUG] found a 34 byte note for user id 1000 [DEBUG] note_length is 34 [DEBUG] read(fd, note_buffer, note_length) results 0 [DEBUG] note_buffer is [DEBUG] note_buffer[0] is [DEBUG] note_buffer[note_length] is -------[ end of note data ]-------
Я искал на Stackoverflow и здесь об этом но кажется что ни один другой читатель не счел нужным понять почему это не работает :/
Может быть, у кого-то есть другой способ попытаться выяснить, что происходит, или начало решения? Я счастлив делать все сам, но иногда я ограничен опытом, поэтому я и пришел к вам :)