feat: use paste size instead of NULL byte in order to write the paste

Previously, the pastes were written to disk until feuille encountered
a NULL byte. This is now fixed.

+ version bump.
This commit is contained in:
Tom MTT. 2022-11-29 13:57:11 +01:00
parent b61f5c4cae
commit 8c30d271df
7 changed files with 23 additions and 20 deletions

4
bin.c
View file

@ -83,7 +83,7 @@ int paste_exists(char *id)
* id: the ID of the paste.
* -> 0 if done, -1 if not.
*/
int write_paste(char *paste, char *id)
int write_paste(char *paste, unsigned long paste_size, char *id)
{
/* open the file with write access */
FILE *file;
@ -91,7 +91,7 @@ int write_paste(char *paste, char *id)
return -1;
/* write the content to file */
if (fputs(paste, file) == -1) {
if (fwrite(paste, paste_size, sizeof(char), file) == -1) {
fclose(file);
return -1;
}

2
bin.h
View file

@ -17,7 +17,7 @@
#include "feuille.h"
int paste_exists(char *);
int write_paste(char *, char *);
int write_paste(char *, unsigned long, char *);
char *generate_id(int);
char *create_url(char *);

View file

@ -1,5 +1,5 @@
# feuille version
VERSION = 1.18.2
VERSION = 1.19.0
# paths (customize them to fit your system)
PREFIX = /usr/local

View file

@ -14,7 +14,7 @@
. ftr VB CB
. ftr VBI CBI
.\}
.TH "feuille" "1" "November 2022" "feuille 1.18.2" ""
.TH "feuille" "1" "November 2022" "feuille 1.19.0" ""
.hy
.SH NAME
.PP

View file

@ -95,6 +95,8 @@ void accept_loop(int server)
while ((connection = accept_connection(server))) {
verbose(1, "--- new incoming connection. connection ID: %d:%d ---", pid, time(0));
unsigned long paste_size = 0;
char *paste = NULL;
char *id = NULL;
char *url = NULL;
@ -102,7 +104,7 @@ void accept_loop(int server)
/* read paste from connection */
verbose(1, "reading paste from incoming connection...");
if ((paste = read_paste(connection)) != NULL) {
if ((paste_size = read_paste(connection, &paste)) != 0) {
/* generate random ID */
verbose(1, "done.");
verbose(2, "generating a random ID...");
@ -112,7 +114,7 @@ void accept_loop(int server)
verbose(2, "done.");
verbose(1, "writing paste `%s' to disk...", id);
if (write_paste(paste, id) == 0) {
if (write_paste(paste, paste_size, id) == 0) {
/* create URL */
verbose(1, "done.");
verbose(2, "making the right URL...");

View file

@ -175,15 +175,16 @@ void close_connection(int connection)
* connection: the socket associated with the connection.
* -> the string containing all data sent, or NULL if an error occured. Needs to be freed.
*/
char *read_paste(int connection)
unsigned long read_paste(int connection, char **output)
{
unsigned long buffer_size = settings.buffer_size;
unsigned long total_size = 0;
/* allocate buffer to store the data */
char *buffer;
if ((buffer = malloc((buffer_size + 2) * sizeof(char))) == NULL)
return NULL;
if ((buffer = malloc((buffer_size + 1) * sizeof(char))) == NULL)
return 0;
/* read all data until EOF is received, or max file size is reached, or the socket timeouts... */
/* each time, the data is appended to the buffer, once it's been reallocated a larger size */
@ -197,7 +198,7 @@ char *read_paste(int connection)
/* yup, free the buffer and return an error */
free(buffer);
errno = EFBIG;
return NULL;
return 0;
}
/* have we reached the end of the buffer? */
@ -207,9 +208,9 @@ char *read_paste(int connection)
/* reallocate the buffer with a larger size */
void *tmp;
if ((tmp = realloc(buffer, (buffer_size + 2) * sizeof(char))) == NULL) {
if ((tmp = realloc(buffer, (buffer_size + 1) * sizeof(char))) == NULL) {
free(buffer);
return NULL;
return 0;
}
buffer = tmp;
@ -223,14 +224,14 @@ char *read_paste(int connection)
errno = ENOENT;
free(buffer);
return NULL;
return 0;
}
/* end the buffer with a newline and a null byte */
/* end the buffer with a newline */
buffer[total_size] = '\n';
buffer[total_size + 1] = 0;
return buffer;
*output = buffer;
return total_size + 1; /* newline */
}
/**

View file

@ -21,7 +21,7 @@ int initialize_server();
int accept_connection(int);
void close_connection(int);
char *read_paste(int);
unsigned long read_paste(int, char **);
int send_response(int, char *);
#endif