Skip to content

Commit

Permalink
Implement a string pool for HTML text, property names, property value…
Browse files Browse the repository at this point in the history
…s, and

header/footer/heading/chapter strings used when rendering PS or PDF.  This
prevents a whole category of memory management bugs and also will help lower
memory usage.
  • Loading branch information
michaelrsweet committed Aug 12, 2024
1 parent 7b3cd4f commit 56d0bed
Show file tree
Hide file tree
Showing 8 changed files with 874 additions and 942 deletions.
2 changes: 2 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Changes in HTMLDOC v1.9.19

- Updated HTML and header/footer code to use a string pool to simplify memory
management and fix potential double-free bugs.
- Updated configure script to look for zlib with pkg-config (Issue #519)
- Updated markdown support code to mmd.

Expand Down
1 change: 1 addition & 0 deletions htmldoc/gui.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -4195,6 +4195,7 @@ GUI::generateBookCB(Fl_Widget *w, // I - Widget

htmlDeleteTree(document);
htmlDeleteTree(toc);
hd_strfreeall();

file_cleanup();
image_flush_cache();
Expand Down
98 changes: 47 additions & 51 deletions htmldoc/hdstring.h
Original file line number Diff line number Diff line change
@@ -1,101 +1,97 @@
/*
* String definitions for HTMLDOC, a HTML document processing program.
*
* Copyright 2011-2014 by Michael R Sweet.
* Copyright 1997-2010 by Easy Software Products. All rights reserved.
*
* This program is free software. Distribution and use rights are outlined in
* the file "COPYING".
*/
//
// String definitions for HTMLDOC, a HTML document processing program.
//
// Copyright © 2011-2024 by Michael R Sweet.
// Copyright © 1997-2010 by Easy Software Products. All rights reserved.
//
// This program is free software. Distribution and use rights are outlined in
// the file "COPYING".
//

#ifndef _HDSTRING_H_
# define _HDSTRING_H_

/*
* Include necessary headers...
*/

# include "config.h"

# include <stdio.h>
# include <stdlib.h>
# include <stdarg.h>
# include <string.h>
# include <ctype.h>

# ifdef HAVE_STRINGS_H
# include <strings.h>
# endif /* HAVE_STRINGS_H */

# endif // HAVE_STRINGS_H
# ifdef __cplusplus
extern "C" {
# endif /* __cplusplus */
# endif // __cplusplus


/*
* Define some compatibility macros for Microsoft Windows...
*/
//
// Define some compatibility macros for Microsoft Windows...
//

# ifdef WIN32
# define strcasecmp(s,t) stricmp(s,t)
# define strncasecmp(s,t,n) strnicmp(s,t,n)
# define snprintf _snprintf
# define vsnprintf _vsnprintf
# endif /* WIN32 */
# endif // WIN32


/*
* Implementation of strcpy() that allows for overlapping buffers.
*/
//
// Implementation of strcpy() that allows for overlapping buffers.
//

extern void hd_strcpy(char *dst, const char *src);


/*
* Standard string functions that might not be available...
*/
//
// Simple string pool functions to replace strdup/free usage in most places...
//

# ifndef HAVE_STRDUP
extern char *hd_strdup(const char *);
# define strdup hd_strdup
# endif /* !HAVE_STRDUP */
extern void hd_strfreeall(void);
extern size_t hd_strgetsize(void);


//
// Standard string functions that might not be available...
//

# ifndef HAVE_SNPRINTF
extern int hd_snprintf(char *, size_t, const char *, ...)
# ifdef __GNUC__
__attribute__ ((__format__ (__printf__, 3, 4)))
# endif // __GNUC__
;
# define snprintf hd_snprintf
# endif // !HAVE_SNPRINTF

# ifndef HAVE_STRCASECMP
extern int hd_strcasecmp(const char *, const char *);
# define strcasecmp hd_strcasecmp
# endif /* !HAVE_STRCASECMP */
# endif // !HAVE_STRCASECMP

# ifndef HAVE_STRNCASECMP
extern int hd_strncasecmp(const char *, const char *, size_t n);
# define strncasecmp hd_strncasecmp
# endif /* !HAVE_STRNCASECMP */

# ifndef HAVE_STRLCAT
extern size_t hd_strlcat(char *, const char *, size_t);
# define strlcat hd_strlcat
# endif /* !HAVE_STRLCAT */
# endif // !HAVE_STRLCAT

# ifndef HAVE_STRLCPY
extern size_t hd_strlcpy(char *, const char *, size_t);
# define strlcpy hd_strlcpy
# endif /* !HAVE_STRLCPY */
# endif // !HAVE_STRLCPY

# ifndef HAVE_SNPRINTF
extern int hd_snprintf(char *, size_t, const char *, ...)
# ifdef __GNUC__
__attribute__ ((__format__ (__printf__, 3, 4)))
# endif /* __GNUC__ */
;
# define snprintf hd_snprintf
# endif /* !HAVE_SNPRINTF */
extern int hd_strncasecmp(const char *, const char *, size_t n);
# define strncasecmp hd_strncasecmp
# endif // !HAVE_STRNCASECMP

# ifndef HAVE_VSNPRINTF
extern int hd_vsnprintf(char *, size_t, const char *, va_list);
# define vsnprintf hd_vsnprintf
# endif /* !HAVE_VSNPRINTF */
# endif // !HAVE_VSNPRINTF


# ifdef __cplusplus
}
# endif /* __cplusplus */

#endif /* !_HDSTRING_H_ */
# endif // __cplusplus
#endif // !_HDSTRING_H_
Loading

0 comments on commit 56d0bed

Please sign in to comment.