X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom%2Fmessage.c;h=5f0bdc38ab9dbfde2263e095bb0675865c9d9093;hb=7cbefaec45b82eb0449465da19d38a89f2ff2cf3;hp=23d5c867a41abce99758334432e6997fabc77d30;hpb=37394dd1d49e67022fb7a9afec2d830695e3d10d;p=gedcom-parse.git diff --git a/gedcom/message.c b/gedcom/message.c index 23d5c86..5f0bdc3 100644 --- a/gedcom/message.c +++ b/gedcom/message.c @@ -24,7 +24,13 @@ #include "gedcom_internal.h" #include "gedcom.h" +#if HAVE_VSNPRINTF #define INITIAL_BUF_SIZE 256 +#else +/* Risk on overflowing buffer, so make size big */ +#define INITIAL_BUF_SIZE 65536 +#endif + char *mess_buffer = NULL; size_t bufsize; @@ -41,6 +47,12 @@ void reset_mess_buffer() mess_buffer[0] = '\0'; } +void cleanup_mess_buffer() +{ + if (mess_buffer) + free(mess_buffer); +} + void init_mess_buffer() { if (mess_buffer == NULL) { @@ -48,14 +60,18 @@ void init_mess_buffer() if (mess_buffer) { mess_buffer[0] = '\0'; bufsize = INITIAL_BUF_SIZE; + if (atexit(cleanup_mess_buffer) != 0) + gedcom_warning(_("Could not register buffer cleanup function")); } - else - fprintf(stderr, _("Could not allocate memory at %s, %d\n"), + else { + fprintf(stderr, _("Could not allocate memory at %s, %d"), __FILE__, __LINE__); + fprintf(stderr, "\n"); + } } } -int safe_buf_vappend(char *s, va_list ap) +int safe_buf_vappend(const char *s, va_list ap) { int res = 0; int len; @@ -66,6 +82,7 @@ int safe_buf_vappend(char *s, va_list ap) char *buf_ptr = mess_buffer + len; int rest_size = bufsize - len; +#if HAVE_VSNPRINTF res = vsnprintf(buf_ptr, rest_size, s, ap); if (res > -1 && res < rest_size) { @@ -75,12 +92,21 @@ int safe_buf_vappend(char *s, va_list ap) bufsize *= 2; mess_buffer = realloc(mess_buffer, bufsize); } +#else /* not HAVE_VSNPRINTF */ +# if HAVE_VSPRINTF +# warning "Using VSPRINTF. Buffer overflow could happen!" + vsprintf(buf_ptr, s, ap); + break; +# else /* not HAVE_VPRINTF */ +# error "Your standard library has neither vsnprintf nor vsprintf defined. One of them is required!" +# endif +#endif } } return res; } -int safe_buf_append(char *s, ...) +int safe_buf_append(const char *s, ...) { int res; va_list ap; @@ -92,7 +118,7 @@ int safe_buf_append(char *s, ...) return res; } -int gedcom_message(char* s, ...) +int gedcom_message(const char* s, ...) { int res; va_list ap; @@ -106,13 +132,16 @@ int gedcom_message(char* s, ...) return res; } -int gedcom_warning(char* s, ...) +int gedcom_warning(const char* s, ...) { int res; va_list ap; reset_mess_buffer(); - safe_buf_append(_("Warning on line %d: "), line_no); + if (line_no != 0) + safe_buf_append(_("Warning on line %d: "), line_no); + else + safe_buf_append(_("Warning: ")); va_start(ap, s); res = safe_buf_vappend(s, ap); va_end(ap); @@ -122,13 +151,16 @@ int gedcom_warning(char* s, ...) return res; } -int gedcom_error(char* s, ...) +int gedcom_error(const char* s, ...) { int res; va_list ap; reset_mess_buffer(); - safe_buf_append(_("Error on line %d: "), line_no); + if (line_no != 0) + safe_buf_append(_("Error on line %d: "), line_no); + else + safe_buf_append(_("Error: ")); va_start(ap, s); res = safe_buf_vappend(s, ap); va_end(ap); @@ -138,7 +170,7 @@ int gedcom_error(char* s, ...) return res; } -void gedcom_mem_error(char *filename, int line) +void gedcom_mem_error(const char *filename, int line) { gedcom_error(_("Could not allocate memory at %s, %d"), filename, line); }