Системный вызов в Android NDK - PullRequest
0 голосов
/ 02 июня 2018

Я пытался использовать этот макрос системного вызова для arm_64

. Он работает с SYS_open, считывать и закрывать.Я правильно вижу содержимое файла.

После этого происходит сбой Android APK со следующим сообщением:

A / libc: обнаружено повреждение стека A / libc: фатальный сигнал 6 (SIGABRT)в 0x00007689 (код = -6), поток 32141 (поток-2910)

Кто-нибудь знает, как это исправить?

1 Ответ

0 голосов
/ 04 июня 2018

У вас есть хотя бы одна ошибка в коде по ссылке Godbolt, которую вы разместили.Эти операторы приводят к переполнению буфера (окружающий код и условия if () удалены.)

char buffer[2048];

    length = syscall_read(fd, buffer, sizeof(buffer));

        buffer[length] = 0;

buffer[length] = 0; обращается за пределы массива, если sys_read возвращает 2048. Как говорится на справочной странице, read() пытается прочитать до count байтов , а не count-1.Это может привести к повреждению вашего стека, если массив был размещен прямо под чем-то важным.

Вы должны оставить место для терминатора 0, если вы хотите использовать его как строку C неявной длины вместо явной длиныбуфер + размер с write или memcpy или любым другим.Помните, что данные файла могут содержать 0 байт.

Как обычно, используйте отладчик и убедитесь, что ваш код работает как с обычными системными вызовами, так и с встроенными упаковщиками.

...