Я работаю над приложением Android, которое, помимо прочего, должно отправлять фоновые данные на ftp-сервер. Код, который делает это, написан в машинном коде с использованием стандартных функций Linux.
В большинстве случаев он работает нормально, но время от времени он дает сбой, и cra sh сводит меня с ума , потому что для меня это не имеет смысла.
Вот соответствующий код:
if(!sbuf.st_size)
{
syslog(LOG_CRIT, "FTP: OMFG WE GOT 0 FILE SIZE!!!11!!!! ");
close(fd);
fclose(stream);
close(dsock);
return 0;
}
p = mmap(0, (size_t) sbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if(p==MAP_FAILED)
{
syslog(LOG_CRIT, "FTP: We got a mmap problem.... %s",strerror(errno));
close(fd);
fclose(stream);
close(dsock);
return 0;
}
syslog(LOG_CRIT, "Before fwrite");
if(fwrite(p, 1, (size_t) sbuf.st_size, stream)!=(size_t) sbuf.st_size)
{
syslog(LOG_CRIT, "FTP: We got a fwrite problem.... %s",strerror(errno));
munmap(p, (size_t) sbuf.st_size);
close(fd);
fclose(stream);
close(dsock);
return 0;
}
fflush(stream);
usleep(150000);
syslog(LOG_CRIT, "Before munmap");
munmap(p, (size_t) sbuf.st_size);
//fflush(stream);
close(fd);
fclose(stream);
close(dsock);
int tries=0;
while(1) {
if(tries>3)return 0;
len = ftpTryRead(csock, buffer, 128);
if (len <= 0) {
syslog(LOG_CRIT, "FTP: Got null after upload, len is %i",len);
//return 0;
usleep(300000);
tries++;
continue;
}
if(!strncmp(buffer,"226",3))break;
else
{
syslog(LOG_CRIT, "FTP: Expected 226 but got %s",buffer);
return 0;
}
}
//sleep(2);
syslog(LOG_CRIT, "FTP: Uploading of file %s should be completed.",file);
unlink(file_name);
return 1;
Соответствующий материал в logcat таков:
07-13 21:30:50.557 10268-10376/? E/com.example.ftp_cam: Before munmap
07-13 21:30:50.561 10268-15934/? E/IMemory: cannot dup fd=69, size=4096, err=0 (Bad file descriptor)
07-13 21:30:50.561 10268-15934/? E/IMemory: cannot map BpMemoryHeap (binder=0x7f57d239a0), size=4096, fd=-1 (Bad file descriptor)
07-13 21:30:50.561 10268-15934/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 15934 (Binder:10268_6)
07-13 21:30:50.570 10268-10376/? E/com.example.ftp_cam: FTP: Uploading of file IMG_20200713_082444.jpg should be completed.
Итак, это кажется, что код в munmap вылетает. Однако код продолжается еще немного после segfault, потому что он показывает сообщение о завершении загрузки файла (которое находится ниже по коду).
Есть идеи, в чем может быть проблема? Спасибо за уделенное время!