Template
1
0
mirror of https://github.com/bol-van/zapret2.git synced 2026-03-19 15:55:48 +00:00

nfqws2: fix fread inf loop

This commit is contained in:
bol-van
2026-02-12 11:54:12 +03:00
parent d5231bc4fc
commit 9aaa419f68
4 changed files with 28 additions and 17 deletions

View File

@@ -147,7 +147,7 @@ jobs:
for i in libmnl libnfnetlink libnetfilter_queue ; do
(
cd $i-*
CFLAGS="-Os -flto=auto $CFLAGS" \
CFLAGS="-Os -flto=auto -ffunction-sections -fdata-sections -fvisibility=hidden $CFLAGS" \
./configure --prefix= --host=$TARGET --enable-static --disable-shared --disable-dependency-tracking
make install -j$(nproc) DESTDIR=$DEPS_DIR
)

View File

@@ -15,6 +15,7 @@ int z_readfile(FILE *F, char **buf, size_t *size, size_t extra_alloc)
unsigned char in[ZCHUNK];
size_t bufsize;
void *newbuf;
size_t rd;
memset(&zs, 0, sizeof(zs));
@@ -26,18 +27,18 @@ int z_readfile(FILE *F, char **buf, size_t *size, size_t extra_alloc)
do
{
zs.avail_in = fread_safe(in, 1, sizeof(in), F);
if (ferror(F))
if (!fread_safe(in, 1, sizeof(in), F, &rd))
{
r = Z_ERRNO;
goto zerr;
}
if (!zs.avail_in)
if (!rd)
{
// file is not full
r = Z_DATA_ERROR;
goto zerr;
}
zs.avail_in = rd;
zs.next_in = in;
do
{
@@ -79,7 +80,7 @@ zerr:
bool is_gzip(FILE* F)
{
unsigned char magic[2];
bool b = !fseek(F, 0, SEEK_SET) && fread_safe(magic, 1, 2, F) == 2 && magic[0] == 0x1F && magic[1] == 0x8B;
bool b = !fseek(F, 0, SEEK_SET) && fread(magic, 1, 2, F) == 2 && magic[0] == 0x1F && magic[1] == 0x8B;
fseek(F, 0, SEEK_SET);
return b;
}

View File

@@ -120,8 +120,7 @@ bool load_file(const char *filename, off_t offset, void *buffer, size_t *buffer_
}
}
*buffer_size = fread_safe(buffer, 1, *buffer_size, F);
if (ferror(F))
if (!fread_safe(buffer, 1, *buffer_size, F, buffer_size))
{
fclose(F);
return false;
@@ -512,21 +511,31 @@ ssize_t read_intr(int fd, void *buf, size_t count)
return rd;
}
size_t fread_safe(void *ptr, size_t size, size_t nmemb, FILE *F)
bool fread_safe(void *ptr, size_t size, size_t nmemb, FILE *F, size_t *rd)
{
size_t result, total_read = 0;
size_t result, to_read, total_read = 0;
while (total_read < nmemb)
{
total_read += (result = fread((uint8_t*)ptr + (total_read * size), size, nmemb - total_read, F));
if (result < (nmemb - total_read))
to_read = nmemb - total_read;
errno = 0;
total_read += (result = fread((uint8_t*)ptr + (total_read * size), size, to_read, F));
if (result < to_read)
{
if (errno == EINTR)
clearerr(F);
else
break;
if (ferror(F))
{
if (errno == EINTR)
{
clearerr(F);
continue;
}
*rd = total_read;
return false;
}
break;
}
}
return total_read;
*rd = total_read;
return true;
}
char* fgets_safe(char *s, int size, FILE *stream)
{
@@ -534,6 +543,7 @@ char* fgets_safe(char *s, int size, FILE *stream)
while (true)
{
errno = 0;
if ((result = fgets(s, size, stream))) return result;
if (ferror(stream))
{

View File

@@ -34,7 +34,7 @@ const char *strncasestr(const char *s,const char *find, size_t slen);
bool is_identifier(const char *p);
ssize_t read_intr(int fd, void *buf, size_t count);
size_t fread_safe(void *ptr, size_t size, size_t nmemb, FILE *F);
bool fread_safe(void *ptr, size_t size, size_t nmemb, FILE *F, size_t *rd);
char* fgets_safe(char *s, int size, FILE *stream);
bool load_file(const char *filename, off_t offset, void *buffer, size_t *buffer_size);