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:
parent
b61f5c4cae
commit
8c30d271df
7 changed files with 23 additions and 20 deletions
4
bin.c
4
bin.c
|
@ -83,7 +83,7 @@ int paste_exists(char *id)
|
||||||
* id: the ID of the paste.
|
* id: the ID of the paste.
|
||||||
* -> 0 if done, -1 if not.
|
* -> 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 */
|
/* open the file with write access */
|
||||||
FILE *file;
|
FILE *file;
|
||||||
|
@ -91,7 +91,7 @@ int write_paste(char *paste, char *id)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* write the content to file */
|
/* write the content to file */
|
||||||
if (fputs(paste, file) == -1) {
|
if (fwrite(paste, paste_size, sizeof(char), file) == -1) {
|
||||||
fclose(file);
|
fclose(file);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
2
bin.h
2
bin.h
|
@ -17,7 +17,7 @@
|
||||||
#include "feuille.h"
|
#include "feuille.h"
|
||||||
|
|
||||||
int paste_exists(char *);
|
int paste_exists(char *);
|
||||||
int write_paste(char *, char *);
|
int write_paste(char *, unsigned long, char *);
|
||||||
|
|
||||||
char *generate_id(int);
|
char *generate_id(int);
|
||||||
char *create_url(char *);
|
char *create_url(char *);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# feuille version
|
# feuille version
|
||||||
VERSION = 1.18.2
|
VERSION = 1.19.0
|
||||||
|
|
||||||
# paths (customize them to fit your system)
|
# paths (customize them to fit your system)
|
||||||
PREFIX = /usr/local
|
PREFIX = /usr/local
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
. ftr VB CB
|
. ftr VB CB
|
||||||
. ftr VBI CBI
|
. ftr VBI CBI
|
||||||
.\}
|
.\}
|
||||||
.TH "feuille" "1" "November 2022" "feuille 1.18.2" ""
|
.TH "feuille" "1" "November 2022" "feuille 1.19.0" ""
|
||||||
.hy
|
.hy
|
||||||
.SH NAME
|
.SH NAME
|
||||||
.PP
|
.PP
|
||||||
|
|
|
@ -95,6 +95,8 @@ void accept_loop(int server)
|
||||||
while ((connection = accept_connection(server))) {
|
while ((connection = accept_connection(server))) {
|
||||||
verbose(1, "--- new incoming connection. connection ID: %d:%d ---", pid, time(0));
|
verbose(1, "--- new incoming connection. connection ID: %d:%d ---", pid, time(0));
|
||||||
|
|
||||||
|
unsigned long paste_size = 0;
|
||||||
|
|
||||||
char *paste = NULL;
|
char *paste = NULL;
|
||||||
char *id = NULL;
|
char *id = NULL;
|
||||||
char *url = NULL;
|
char *url = NULL;
|
||||||
|
@ -102,7 +104,7 @@ void accept_loop(int server)
|
||||||
/* read paste from connection */
|
/* read paste from connection */
|
||||||
verbose(1, "reading paste from incoming 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 */
|
/* generate random ID */
|
||||||
verbose(1, "done.");
|
verbose(1, "done.");
|
||||||
verbose(2, "generating a random ID...");
|
verbose(2, "generating a random ID...");
|
||||||
|
@ -112,7 +114,7 @@ void accept_loop(int server)
|
||||||
verbose(2, "done.");
|
verbose(2, "done.");
|
||||||
verbose(1, "writing paste `%s' to disk...", id);
|
verbose(1, "writing paste `%s' to disk...", id);
|
||||||
|
|
||||||
if (write_paste(paste, id) == 0) {
|
if (write_paste(paste, paste_size, id) == 0) {
|
||||||
/* create URL */
|
/* create URL */
|
||||||
verbose(1, "done.");
|
verbose(1, "done.");
|
||||||
verbose(2, "making the right URL...");
|
verbose(2, "making the right URL...");
|
||||||
|
|
21
server.c
21
server.c
|
@ -175,15 +175,16 @@ void close_connection(int connection)
|
||||||
* connection: the socket associated with the connection.
|
* connection: the socket associated with the connection.
|
||||||
* -> the string containing all data sent, or NULL if an error occured. Needs to be freed.
|
* -> 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 buffer_size = settings.buffer_size;
|
||||||
unsigned long total_size = 0;
|
unsigned long total_size = 0;
|
||||||
|
|
||||||
/* allocate buffer to store the data */
|
/* allocate buffer to store the data */
|
||||||
char *buffer;
|
char *buffer;
|
||||||
if ((buffer = malloc((buffer_size + 2) * sizeof(char))) == NULL)
|
if ((buffer = malloc((buffer_size + 1) * sizeof(char))) == NULL)
|
||||||
return NULL;
|
return 0;
|
||||||
|
|
||||||
/* read all data until EOF is received, or max file size is reached, or the socket timeouts... */
|
/* 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 */
|
/* 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 */
|
/* yup, free the buffer and return an error */
|
||||||
free(buffer);
|
free(buffer);
|
||||||
errno = EFBIG;
|
errno = EFBIG;
|
||||||
return NULL;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* have we reached the end of the buffer? */
|
/* have we reached the end of the buffer? */
|
||||||
|
@ -207,9 +208,9 @@ char *read_paste(int connection)
|
||||||
|
|
||||||
/* reallocate the buffer with a larger size */
|
/* reallocate the buffer with a larger size */
|
||||||
void *tmp;
|
void *tmp;
|
||||||
if ((tmp = realloc(buffer, (buffer_size + 2) * sizeof(char))) == NULL) {
|
if ((tmp = realloc(buffer, (buffer_size + 1) * sizeof(char))) == NULL) {
|
||||||
free(buffer);
|
free(buffer);
|
||||||
return NULL;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer = tmp;
|
buffer = tmp;
|
||||||
|
@ -223,14 +224,14 @@ char *read_paste(int connection)
|
||||||
errno = ENOENT;
|
errno = ENOENT;
|
||||||
|
|
||||||
free(buffer);
|
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] = '\n';
|
||||||
buffer[total_size + 1] = 0;
|
|
||||||
|
|
||||||
return buffer;
|
*output = buffer;
|
||||||
|
return total_size + 1; /* newline */
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
2
server.h
2
server.h
|
@ -21,7 +21,7 @@ int initialize_server();
|
||||||
int accept_connection(int);
|
int accept_connection(int);
|
||||||
void close_connection(int);
|
void close_connection(int);
|
||||||
|
|
||||||
char *read_paste(int);
|
unsigned long read_paste(int, char **);
|
||||||
int send_response(int, char *);
|
int send_response(int, char *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Reference in a new issue