From b9fcd2e1536437168a31d6dedfe567c6cd5b1e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Mon, 17 Oct 2022 12:56:55 +0800 Subject: [PATCH] fix base16384_decode_fd --- base16384.c | 1 + base16384.h | 1 + file.c | 12 +++++++----- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/base16384.c b/base16384.c index a2dd1f1..2e466de 100644 --- a/base16384.c +++ b/base16384.c @@ -103,6 +103,7 @@ int main(int argc, char** argv) { case base16384_err_write_file: perror("base16384_err_write_file"); break; case base16384_err_open_input_file: perror("base16384_err_open_input_file"); break; case base16384_err_map_input_file: perror("base16384_err_map_input_file"); break; + case base16384_err_read_file: perror("base16384_err_read_file"); break; default: perror("base16384"); break; } return exitstat; diff --git a/base16384.h b/base16384.h index 21fe64a..daaae49 100644 --- a/base16384.h +++ b/base16384.h @@ -32,6 +32,7 @@ enum base16384_err_t { base16384_err_write_file, base16384_err_open_input_file, base16384_err_map_input_file, + base16384_err_read_file, }; // base16384_err_t is the return value of base16384_en/decode_file typedef enum base16384_err_t base16384_err_t; diff --git a/file.c b/file.c index 6952d15..3d50442 100644 --- a/file.c +++ b/file.c @@ -35,7 +35,7 @@ #ifdef __cosmopolitan #define get_file_size(filepath) ((off_t)GetFileSize(filepath)) #else -static off_t get_file_size(const char* filepath) { +static inline off_t get_file_size(const char* filepath) { struct stat statbuf; return stat(filepath, &statbuf)?-1:statbuf.st_size; } @@ -152,7 +152,7 @@ base16384_err_t base16384_encode_fd(int input, int output, char* encbuf, char* d #define skip_offset(input_file) ((input_file[0]==(char)0xFE)?2:0) -static int is_next_end(FILE* fp) { +static inline int is_next_end(FILE* fp) { int ch = fgetc(fp); if(ch == EOF) return 0; if(ch == '=') return fgetc(fp); @@ -246,7 +246,7 @@ base16384_err_t base16384_decode_fp(FILE* input, FILE* output, char* encbuf, cha return base16384_err_ok; } -static int is_next_end_fd(int fd) { +static inline int is_next_end_fd(int fd) { char ch = 0; read(fd, &ch, 1); if(ch == '=') { @@ -267,9 +267,11 @@ base16384_err_t base16384_decode_fd(int input, int output, char* encbuf, char* d int cnt = 0; int end = 0; decbuf[0] = 0; - read(input, decbuf, 2); + if(read(input, decbuf, 2) < 2) { + return base16384_err_read_file; + } if(decbuf[0] != (char)(0xfe)) cnt = 2; - while((end = read(input, decbuf+cnt, inputsize-cnt), cnt) > 0 || cnt > 0) { + while((end = read(input, decbuf+cnt, inputsize-cnt)) > 0 || cnt > 0) { if(end > 0) { cnt += end; if((end = is_next_end_fd(input))) {