2020#include < stdint.h>
2121#include < inttypes.h>
2222#include < iostream>
23+ #include < fstream>
2324#include < stdlib.h>
2425#include < stdio.h>
2526#include < errno.h>
@@ -77,55 +78,26 @@ static void ignore_sigpipe ()
7778 fprintf (stderr, gettext (" Failed to install SIGPIPE handler: %s\n " ), strerror (errno));
7879}
7980
80- static long get_file_size (const char * filename)
81+ static size_t load_file (const char * filename, char ** content )
8182{
82- FILE *fp;
83-
84- fp = fopen (filename, " rb" );
85- if (fp)
86- {
87- long size;
88-
89- if ((0 != fseek (fp, 0 , SEEK_END)) || (-1 == (size = ftell (fp))))
90- size = 0 ;
91-
92- fclose (fp);
93-
83+ ifstream fp (filename, ios::in | ios::binary | ios::ate);
84+ if (fp.is_open ())
85+ {
86+ int size = fp.tellg ();
87+ *content = (char *) malloc (size * sizeof (char ));
88+ fp.seekg (0 , ios::beg);
89+ fp.read (*content, size);
90+ fp.close ();
9491 return size;
95- }
96- else
92+ }
9793 return 0 ;
9894}
9995
100- static char * load_file (const char *filename)
96+ static char * load_file (const char *filename)
10197{
102- FILE *fp;
103- char *buffer;
104- long size;
105-
106- size = get_file_size (filename);
107- if (size == 0 )
108- return NULL ;
109-
110- fp = fopen (filename, " rb" );
111- if (!fp)
112- return NULL ;
113-
114- buffer = (char *) malloc (size);
115- if (!buffer)
116- {
117- fclose (fp);
118- return NULL ;
119- }
120-
121- if (size != (int ) fread (buffer, 1 , size, fp))
122- {
123- free (buffer);
124- buffer = NULL ;
125- }
126-
127- fclose (fp);
128- return buffer;
98+ char * content = NULL ;
99+ load_file (filename, &content);
100+ return content;
129101}
130102
131103// LOGGING DELEGATE
@@ -154,19 +126,25 @@ void unescaper::unescape(char* s) const {}
154126// WEBSERVER CREATOR
155127create_webserver& create_webserver::https_mem_key (const std::string& https_mem_key)
156128{
157- _https_mem_key = load_file (https_mem_key.c_str ());
129+ char * _https_mem_key_pt = load_file (https_mem_key.c_str ());
130+ _https_mem_key = _https_mem_key_pt;
131+ free (_https_mem_key_pt);
158132 return *this ;
159133}
160134
161135create_webserver& create_webserver::https_mem_cert (const std::string& https_mem_cert)
162136{
163- _https_mem_cert = load_file (https_mem_cert.c_str ());
137+ char * _https_mem_cert_pt = load_file (https_mem_cert.c_str ());
138+ _https_mem_cert = _https_mem_cert_pt;
139+ free (_https_mem_cert_pt);
164140 return *this ;
165141}
166142
167143create_webserver& create_webserver::https_mem_trust (const std::string& https_mem_trust)
168144{
169- _https_mem_trust = load_file (https_mem_trust.c_str ());
145+ char * _https_mem_trust_pt = load_file (https_mem_trust.c_str ());
146+ _https_mem_trust = _https_mem_trust_pt;
147+ free (_https_mem_trust_pt);
170148 return *this ;
171149}
172150
@@ -787,10 +765,20 @@ int webserver::answer_to_connection(void* cls, MHD_Connection* connection,
787765#endif
788766 if (dhrs.response_type == http_response::FILE_CONTENT)
789767 {
790- struct stat st;
791- fstat (dhrs.fp , &st);
792- size_t filesize = st.st_size ;
793- response = MHD_create_response_from_fd (filesize, dhrs.fp );
768+ char * page = NULL ;
769+ size_t size = load_file (dhrs.filename .c_str (), &page);
770+ if (size)
771+ response = MHD_create_response_from_buffer (size, page, MHD_RESPMEM_MUST_FREE);
772+ else
773+ {
774+ if (user != 0x0 )
775+ free (user);
776+ if (pass != 0x0 )
777+ free (pass);
778+ if (digested_user != 0x0 )
779+ free (digested_user);
780+ return not_found_page (cls, connection);
781+ }
794782 }
795783 else if (dhrs.response_type == http_response::SWITCH_PROTOCOL)
796784 {
@@ -800,11 +788,13 @@ int webserver::answer_to_connection(void* cls, MHD_Connection* connection,
800788 {
801789 if (dhrs.content != " " )
802790 {
791+ // this process is necessary to avoid to truncate byte strings to '\0'
803792 vector<char > v_page (dhrs.content .begin (), dhrs.content .end ());
804793 size_t size = v_page.size ();
805- char page[size];
806- memcpy ( (char *) page, &v_page[0 ], sizeof ( char ) * size );
807- response = MHD_create_response_from_buffer (size, page, MHD_RESPMEM_MUST_COPY);
794+ char * page = (char *) malloc (sizeof (char )*size);
795+ memcpy ( page, &v_page[0 ], sizeof ( char ) * size );
796+ // end string conversion process
797+ response = MHD_create_response_from_buffer (size, page, MHD_RESPMEM_MUST_FREE);
808798 }
809799 else
810800 {
0 commit comments