LINUX.ORG.RU

Доступ к памяти на чтение


0

1

Всем привет, и доброй ночи | дня | утра | вечера. Хочу понять... например, есть библиотека, в ней есть функция с прототипом:

read_data(void *data, size_t len);

Понятно, что data - указатель на данные, len - размер этих данных. Эта функция из библиотеки возможно будет вызываться из многих программ, и существует вероятность того, что len будет валидным, а вот data... data может быть указателем на память после mmap или ioctl+copy_to_user...

Проверка того, что data == NULL необходима или достаточна?

Как проверить, что память, на которую указывает data доступна для чтения в размере len? Говорят, что в оффтопике есть функция IsBadPtr, которая как раз и применяется для этого вопроса.


Как проверить, что память, на которую указывает data доступна для чтения в размере len?

Никак, AFAIK...

Говорят, что в оффтопике есть функция IsBadPtr, которая как раз и применяется для этого вопроса.

...и тебе не нужно это, тупо потому, что атрибуты памяти могут измениться между окончанием проверки доступа и собственно обращением к памяти.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Никак, AFAIK...

Ага... Т.е. ни сам процесс, ни ядро, не смогут определить достаточно достоверно такую ситуацию:

Вот например у нас есть указатель на памать, по адресу 0xbla-bla-bla. Как удостоверится в том, что сможет ли процесс или ядро считать заданный размер данных из этой памяти?

Dennis7
() автор топика
Ответ на: комментарий от Dennis7

Т.е. ни сам процесс, ни ядро, не смогут определить достаточно достоверно такую ситуацию:

О ядре ты раньше не говорил. Ядро может, но мое замечание относится и к нему..

tailgunner ★★★★★
()
Ответ на: комментарий от Ivanz

Это немного не то, по-моему, беглый взгляд подсказывает мне, что тут говорится о страницах памяти, находящихся в RAM, а не сваливающихся в своп. А читать можно и из страниц, которые в свопе находятся.

Dennis7
() автор топика
Ответ на: комментарий от Dennis7

беглый взгляд подсказывает мне, что тут говорится о страницах памяти, находящихся в RAM, а не сваливающихся в своп

Кхм. По-моему, ты взялся за задачу, которая тебе не по силам.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Кхм. По-моему, ты взялся за задачу, которая тебе не по силам.

Гм, хотелось бы узнать обоснование такого заявления...

Dennis7
() автор топика
Ответ на: комментарий от Dennis7

Ты упорствуешь в своем заблуждении; твой беглый взгляд неверен и выдает плохое знакомство с предметом.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Блин, а вот теперь я прочитал вот это:

How to test if an address is readable in linux userspace app:

The canonical way is to use the write() system call to read from the page (writing to a dummy pipe() file descriptor). Instead of faulting, it will return -1 with errno == EFAULT if the buffer to be written is unreadable.

Dennis7
() автор топика

Как проверить, что память, на которую указывает data доступна для чтения в размере len?

Если возникает необходимость такой проверки - то что-то не так...

madcore ★★★★★
()
Ответ на: комментарий от tailgunner

А почему «атрибуты памяти (тут наверно имеются в виду флаги доступа, или если я не прав, то уж поправьте) могут измениться между окончанием проверки доступа и собственно обращением к памяти»?

Хотя бы ссылочку дадите, чтобы почитать...

Dennis7
() автор топика
Ответ на: комментарий от Dennis7

А почему «атрибуты памяти (тут наверно имеются в виду флаги доступа, или если я не прав, то уж поправьте) могут измениться между окончанием проверки доступа и собственно обращением к памяти»?

Ты слышал о многозадачности, о параллельном исполнении?

Хотя бы ссылочку дадите, чтобы почитать...

man pthread_create

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ты слышал о многозадачности, о параллельном исполнении?

Да, было дело :)

Но разве не для этого придуманы средства синхронизации между потоками и процессами для доступа к одним и тем же страницам памяти? Я, в своем вопросе, подразумевал, что все операции над памятью в данном контексте происходят атомарно с точки зрения процесса/потока. Но в любом случае, спасибо.

Dennis7
() автор топика
Ответ на: комментарий от Dennis7

Но разве не для этого придуманы средства синхронизации между потоками и процессами для доступа к одним и тем же страницам памяти?

Сначала следовало бы объяснить, для чего «этого».

Я, в своем вопросе, подразумевал

Похоже, ты в своем вопросе подразумевал, что мы умеем читать мысли, а программы всегда работают так, как тебе хочется. В любом случае, стандартное предупреждение я тебе зачитал, а дальше дело твое.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

А, ну да... знаю... Собираю то-то версией такой-то, версия того, чем собираю такая-то + библиотека такая-то версии такой-то, ядро - версия такая-то, gcc - версия такая-то...

Dennis7
() автор топика
Ответ на: комментарий от Dennis7

зачем библиотеке проверять память которую ей подсовывают? валидность этой памяти забота программы которая использует библиотеку.

trashymichael ★★★
()
Ответ на: комментарий от Dennis7

Общие фразы - далеко недостаточны.

Боюсь, ты не сможешь выделить частный говнокод, чтобы продемонстрировать ситуацию.

madcore ★★★★★
()
Ответ на: комментарий от Dennis7

Собираю то-то версией такой-то, версия того, чем собираю такая-то + библиотека такая-то версии такой-то, ядро - версия такая-то, gcc - версия такая-то...

Это всё не имеет никакого отношения к решаемой проблеме. То, что ты этого не понимаешь - плохой знак.

tailgunner ★★★★★
()
Ответ на: комментарий от Dennis7

Могу... Но это будет реальный говнокод. ЛОР меня потом какашками забросает.

Это и без кода происходит, что терять?

madcore ★★★★★
()
Ответ на: комментарий от Dennis7

ну щащищай от дурака, больше библиотек програм, неочевидных и сложных а как же атомные бомбы, потопы и наводнения? прогноз погоды ты смотреть не будешь пере обработкой указателя?

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

пользователю библиотеки хочется, чтобы всё работало само. Еще по Delphi помню, какие титанические усилия прилагали разработчики сторонних компонентов, чтобы не дать пользователю сделать что-нибудь незапланированное. Кода валидаторов было чуть ли не больше основного кода компонентов — но уж если ты сделаешь ошибку, компонент объяснит тебе, в чем ты не прав, как ты не прав, и что именно нужно поправить, чтобы ты стал прав.

stevejobs ★★★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.