Функция fopen
нуждается в строке с нулевым символом в конце, поэтому перед передачей в fopen
необходимо убедиться, что имя файла из полученного буфера имеет нулевое значение.Благодаря реализации в ваших фрагментах кода за именем файла могут следовать произвольные данные, если вы не заполните buf
с помощью '\0'
перед вызовом recvfrom
.
Существуют различные варианты выполнения этого требования.
Отправьте имя файла , включая '\0'
:
/* use strlen(buf)+1 to include the terminating '\0' */
n = sendto(sfd, buf, strlen(buf)+1, 0, rp->ai_addr, rp->ai_addrlen);
В этом случае получатель получит буфер, включающий '\0'
.Но было бы неплохо проверить, что полученная строка на самом деле заканчивается '\0'
.
Или добавьте '\0'
после получения строки:
/* use BUF_SIZE-1 to reserve at least 1 byte for '\0' */
n = recvfrom(sfd, buf, BUF_SIZE-1, 0,
(struct sockaddr *) &peer_addr, &peer_addr_len);
if(n >= 0) {
buf[n] = '\0';
}
Добавление обеих модификаций приведет кПрограмма более устойчива.
В реальном коде вы должны добавить обработку ошибок для всех функций, которые могут указывать на ошибку с их возвращаемым значением.