attila <att...@stalphonsos.com> writes: > attila <att...@stalphonsos.com> writes: > >> attila <att...@stalphonsos.com> writes: >> >>> Michael McConville <mm...@mykolab.com> writes: >>> >>>> attila wrote: >>>>> Ping. >>>>> >>>>> Just tested that the diff works against recentish i386 snap (22 May). >>>>> Patch attached. >>>> >>>> I can't comment on all of the changes, but this builds and runs fine for >>>> me. >>>> >>> >>> Attached is an update that brings us from 4.7.1 to 5.4.0, released 8 >>> Aug. It shuffles the patches around because the source tree was >>> rearranged and adds support for tests. Sadly, the tests don't all >>> pass. I think I need a t-dep for something LaTeXish but I'm not sure >>> what is best, nor am I sure if that's the only reason for the >>> failures. If anyone has a spare cycle or two to look at it I'd >>> appreciate it. If not I'll get back to it by the end of the week. >>> >>> Pax, -A >> >> I finally got back to this. It turns out there wasn't much standing >> in the way of the tests working other than me. Attached is a patch >> that brings textproc/multimarkdown up to the latest release (5.4.0 >> released 5 Aug). Notable changes: >> >> * Switched to CMake; >> * Ditched the patches I tried and failed to upstream (strcat/sprintf); >> * Reworked two remaining patches (HAVE_SRAND_DETERMINISTIC) in the hope >> I might get them upstream; >> * Added pledge; >> * make test now passes all tests. >> >> Tested on amd64. >> >> Comments, feedback most welcome. >> >> Pax, -A > > Ping.
I reinstated the strcat/sprintf-related patches but done slightly better. Tests pass on amd64. Updated patch attached. Feedback, comments most welcome. Pax, -A -- http://haqistan.net/~attila | att...@stalphonsos.com | 0x62A729CF
Index: Makefile =================================================================== RCS file: /cvs/ports/textproc/multimarkdown/Makefile,v retrieving revision 1.2 diff -u -p -r1.2 Makefile --- Makefile 5 Apr 2015 13:31:15 -0000 1.2 +++ Makefile 1 Oct 2016 18:11:36 -0000 @@ -1,34 +1,45 @@ # $OpenBSD: Makefile,v 1.2 2015/04/05 13:31:15 sthen Exp $ -V = 4.7.1 +V = 5.4.0 COMMENT = marked-up plain text to formatted document converter DISTNAME = ${GH_PROJECT}-${V} -PKGNAME = multimarkdown-${V} +PKGNAME = multimarkdown-${V:C/-/./} CATEGORIES = textproc GH_ACCOUNT = fletcher -GH_PROJECT = MultiMarkdown-4 +GH_PROJECT = MultiMarkdown-5 GH_TAGNAME = ${V} +TESTS_COMMIT = 8d5ad66e3bbaeb0de8646783bfe964261ddb39c7 +DIST_SUBDIR = multimarkdown +MASTER_SITES_GITHUB = https://github.com/fletcher/MMD-Test-Suite/archive/ +DISTFILES = ${DISTNAME}${EXTRACT_SUFX} ${TESTS_COMMIT}${EXTRACT_SUFX} HOMEPAGE = http://fletcherpenney.net/multimarkdown/ MAINTAINER = Sean Levy <att...@stalphonsos.com> # Dual licensed: MIT and GPLv2+ PERMIT_PACKAGE_CDROM = Yes -WANTLIB += c +# uses pledge() +WANTLIB += c BUILD_DEPENDS = devel/greg -USE_GMAKE = Yes -ALL_TARGET = ALL -MAKE_FLAGS = CFLAGS="${CFLAGS} -include GLibFacade.h -DHAVE_ARC4RANDOM" \ - GREG=${LOCALBASE}/bin/greg +MODULES = devel/cmake -# Test files aren't included in distfile. -NO_TEST = Yes +CFLAGS += -DHAVE_SRAND_DETERMINISTIC + +CONFIGURE_ARGS += -DGREG=${LOCALBASE}/bin/greg + +post-extract: + rm -rf ${WRKSRC}/submodules/MarkdownTest + cp -r ${WRKDIR}/MMD-Test-Suite-${TESTS_COMMIT} \ + ${WRKSRC}/submodules/MarkdownTest + +pre-configure: + touch ${WRKBUILD}/README.html do-install: - ${INSTALL_PROGRAM} ${WRKSRC}/multimarkdown ${PREFIX}/bin/ + ${INSTALL_PROGRAM} ${WRKBUILD}/multimarkdown ${PREFIX}/bin/ .include <bsd.port.mk> Index: distinfo =================================================================== RCS file: /cvs/ports/textproc/multimarkdown/distinfo,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 distinfo --- distinfo 24 Mar 2015 19:16:13 -0000 1.1.1.1 +++ distinfo 1 Oct 2016 18:11:36 -0000 @@ -1,2 +1,4 @@ -SHA256 (MultiMarkdown-4-4.7.1.tar.gz) = gy5dzm+hv/TWfmSsLMJPCSCujZEoDlPqh5I3odQ/SGU= -SIZE (MultiMarkdown-4-4.7.1.tar.gz) = 120896 +SHA256 (multimarkdown/8d5ad66e3bbaeb0de8646783bfe964261ddb39c7.tar.gz) = xGdoX+aZ/y+8ND+LXK24XSgNCccYJV9S6qAW2NI/DKw= +SHA256 (multimarkdown/MultiMarkdown-5-5.4.0.tar.gz) = HMA4X/1sghwmXpcPgcxOwAnH7Lv7EuDhFce7WzPQmoM= +SIZE (multimarkdown/8d5ad66e3bbaeb0de8646783bfe964261ddb39c7.tar.gz) = 185408 +SIZE (multimarkdown/MultiMarkdown-5-5.4.0.tar.gz) = 136693 Index: patches/patch-CMakeLists_txt =================================================================== RCS file: patches/patch-CMakeLists_txt diff -N patches/patch-CMakeLists_txt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-CMakeLists_txt 1 Oct 2016 18:11:36 -0000 @@ -0,0 +1,14 @@ +$OpenBSD$ + +Use installed greg +--- CMakeLists.txt.orig Mon Feb 22 20:05:02 2016 ++++ CMakeLists.txt Tue Mar 22 12:45:41 2016 +@@ -149,7 +149,7 @@ endif () + # Need to build parser.c via greg + add_custom_command ( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/parser.c +- COMMAND ${PROJECT_SOURCE_DIR}/submodules/greg/greg -o ${CMAKE_CURRENT_BINARY_DIR}/parser.c ${PROJECT_SOURCE_DIR}/src/parser.leg ++ COMMAND ${GREG} -o ${CMAKE_CURRENT_BINARY_DIR}/parser.c ${PROJECT_SOURCE_DIR}/src/parser.leg + ) + + # src_files are the primary files, and will be included in doxygen documentation Index: patches/patch-Makefile =================================================================== RCS file: patches/patch-Makefile diff -N patches/patch-Makefile --- patches/patch-Makefile 24 Mar 2015 19:16:13 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,37 +0,0 @@ -$OpenBSD: patch-Makefile,v 1.1.1.1 2015/03/24 19:16:13 okan Exp $ - -Make it possible to pass GREG=/usr/local/bin/greg in on the -command line and avoid git submodules. - ---- Makefile.orig Mon Mar 23 18:21:56 2015 -+++ Makefile Mon Mar 23 18:32:22 2015 -@@ -32,18 +32,25 @@ ifeq ($(MAKECMDGOALS),static) - LDFLAGS += -static -static-libgcc - endif - --GREG= greg/greg -+# OUR_GREG: the version of greg in a submodule -+# GREG: the path to greg we want to use for parser.leg -+# -+# This way we can pass GREG=/usr/local/bin/greg in on -+# the command line if we have greg installed already. - -+OUR_GREG=greg/greg -+GREG?=$(OUR_GREG) -+ - ALL : $(PROGRAM) enumMap.txt - static : $(PROGRAM) enumMap.txt - - %.o : %.c parser.h - $(CC) -c $(CFLAGS) -o $@ $< - --parser.c : parser.leg greg/greg parser.h -- greg/greg -o parser.c parser.leg -+parser.c : parser.leg $(GREG) parser.h -+ $(GREG) -o parser.c parser.leg - --$(GREG): greg -+$(OUR_GREG): greg - $(MAKE) -C greg - - $(PROGRAM) : $(OBJS) Index: patches/patch-html_c =================================================================== RCS file: patches/patch-html_c diff -N patches/patch-html_c --- patches/patch-html_c 24 Mar 2015 19:16:13 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,59 +0,0 @@ -$OpenBSD: patch-html_c,v 1.1.1.1 2015/03/24 19:16:13 okan Exp $ - -Switch to using arc4random(3) everywhere, since they don't really want -repeatability (as evidenced by the arguments they pass to srand(3)). - ---- html.c.orig Mon Mar 9 18:52:39 2015 -+++ html.c Sat Mar 21 15:44:10 2015 -@@ -112,8 +112,12 @@ void print_html_node(GString *out, node *n, scratch_pa - scratch->footnote_para_counter --; - if (scratch->footnote_para_counter == 0) { - if (scratch->extensions & EXT_RANDOM_FOOT) { -+#ifdef HAVE_ARC4RANDOM -+ random = arc4random_uniform(99999) + 1; -+#else - srand(scratch->random_seed_base + scratch->footnote_to_print); - random = rand() % 99999 + 1; -+#endif - } else { - random = scratch->footnote_to_print; - } -@@ -574,8 +578,12 @@ void print_html_node(GString *out, node *n, scratch_pa - temp_node = node_for_count(scratch->used_notes, lev); - - if (scratch->extensions & EXT_RANDOM_FOOT) { -+#ifdef HAVE_ARC4RANDOM -+ random = arc4random_uniform(99999) + 1; -+#else - srand(scratch->random_seed_base + lev); - random = rand() % 99999 + 1; -+#endif - } else { - random = lev; - } -@@ -628,8 +636,12 @@ void print_html_node(GString *out, node *n, scratch_pa - fprintf(stderr, "matching cite found - %d\n",lev); - #endif - if (scratch->extensions & EXT_RANDOM_FOOT) { -+#ifdef HAVE_ARC4RANDOM -+ random = arc4random_uniform(99999) + 1; -+#else - srand(scratch->random_seed_base + lev); - random = rand() % 99999 + 1; -+#endif - } else { - random = lev; - } -@@ -901,8 +913,12 @@ void print_html_endnotes(GString *out, scratch_pad *sc - pad(out, 1, scratch); - - if (scratch->extensions & EXT_RANDOM_FOOT) { -+#ifdef HAVE_ARC4RANDOM -+ random = arc4random_uniform(99999) + 1; -+#else - srand(scratch->random_seed_base + counter); - random = rand() % 99999 + 1; -+#endif - } else { - random = counter; - } Index: patches/patch-latex_c =================================================================== RCS file: patches/patch-latex_c diff -N patches/patch-latex_c --- patches/patch-latex_c 24 Mar 2015 19:16:13 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,29 +0,0 @@ -$OpenBSD: patch-latex_c,v 1.1.1.1 2015/03/24 19:16:13 okan Exp $ - -Switch from strcat(3) to a safer idiom. - ---- latex.c.orig Mon Mar 9 18:52:39 2015 -+++ latex.c Sat Mar 21 15:44:10 2015 -@@ -1202,16 +1202,16 @@ void print_latex_url(GString *out, char *str, scratch_ - char * correct_dimension_units(char *original) { - char *result; - int i; -- -+ size_t result_len; -+ - result = strdup(original); -- -+ result_len = strlen(result); -+ - for (i = 0; result[i]; i++) - result[i] = tolower(result[i]); - -- if (strstr(&result[strlen(result)-2],"px")) { -- result[strlen(result)-2] = '\0'; -- strcat(result, "pt"); -- } -+ if (strstr(&result[result_len-2],"px")) -+ result[result_len-1] = 't'; - - return result; - } Index: patches/patch-parse_utilities_c =================================================================== RCS file: patches/patch-parse_utilities_c diff -N patches/patch-parse_utilities_c --- patches/patch-parse_utilities_c 24 Mar 2015 19:16:13 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,52 +0,0 @@ -$OpenBSD: patch-parse_utilities_c,v 1.1.1.1 2015/03/24 19:16:13 okan Exp $ - -ifdef out pragmas that don't work under OpenBSD. Use arc4random(3). - ---- parse_utilities.c.orig Mon Sep 22 12:57:41 2014 -+++ parse_utilities.c Wed Jan 7 16:02:19 2015 -@@ -22,7 +22,9 @@ - #include "parser.h" - #include <libgen.h> - -+#ifndef __OpenBSD__ - #pragma mark - Parse Tree -+#endif /* __OpenBSD__ */ - - /* Create a new node in the parse tree */ - node * mk_node(int key) { -@@ -219,7 +221,9 @@ void append_list(node *new, node *list) { - } - } - -+#ifndef __OpenBSD__ - #pragma mark - Parser Data -+#endif /* __OpenBSD__ */ - - /* Create parser data - this is where you stash stuff to communicate - into and out of the parser */ -@@ -250,7 +254,9 @@ void free_parser_data(parser_data *data) { - } - - /* mk_scratch_pad -- store stuff here while exporting the result tree */ -+#ifndef HAVE_ARC4RANDOM - void ran_start(long seed); -+#endif - scratch_pad * mk_scratch_pad(unsigned long extensions) { - scratch_pad *result = (scratch_pad *)malloc(sizeof(scratch_pad)); - result->extensions = extensions; -@@ -277,6 +283,7 @@ scratch_pad * mk_scratch_pad(unsigned long extensions) - result->table_alignment = NULL; - result->table_column = 0; - -+#ifndef HAVE_ARC4RANDOM - if (extensions & EXT_RANDOM_FOOT) { - srand((int)time(NULL)); - result->random_seed_base = rand() % 32000; -@@ -285,6 +292,7 @@ scratch_pad * mk_scratch_pad(unsigned long extensions) - result->random_seed_base = 0; - } - ran_start(310952L); -+#endif /* !HAVE_ARC4RANDOM */ - - result->lyx_para_type = PARA; /* CRC - Simple paragraph */ - result->lyx_level = 0; /* CRC - out outside level */ Index: patches/patch-parser_leg =================================================================== RCS file: patches/patch-parser_leg diff -N patches/patch-parser_leg --- patches/patch-parser_leg 24 Mar 2015 19:16:13 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,19 +0,0 @@ -$OpenBSD: patch-parser_leg,v 1.1.1.1 2015/03/24 19:16:13 okan Exp $ - -Switch from sprintf(3) to snprintf(3) - ---- parser.leg.orig Mon Mar 9 18:52:39 2015 -+++ parser.leg Sat Mar 21 15:44:10 2015 -@@ -562,8 +562,10 @@ AutoLinkUrl = '<' < [A-Za-z]+ "://" ( !Newline !'>' - - AutoLinkEmail = '<' ( "mailto:" )? < [-A-Za-z0-9+_./!%~$]+ '@' ( !Newline !'>' . )+ > '>' - { -- char *mailto = malloc(strlen(yytext) + 8); -- sprintf(mailto, "mailto:%s", yytext); -+ size_t mailto_len = strlen(yytext) + 8; -+ char *mailto = malloc(mailto_len); -+ assert(mailto); -+ assert(snprintf(mailto,mailto_len,"mailto:%s",yytext) < mailto_len); - $$ = mk_link(str(yytext), NULL, mailto, NULL, NULL); - free(mailto); - } Index: patches/patch-src_html_c =================================================================== RCS file: patches/patch-src_html_c diff -N patches/patch-src_html_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_html_c 1 Oct 2016 18:11:36 -0000 @@ -0,0 +1,53 @@ +$OpenBSD$ + +Use srand_deterministic(3) if available. +--- src/html.c.orig Fri Aug 5 09:08:36 2016 ++++ src/html.c Thu Sep 15 15:35:50 2016 +@@ -115,7 +115,11 @@ void print_html_node(GString *out, node *n, scratch_pa + scratch->footnote_para_counter --; + if (scratch->footnote_para_counter == 0) { + if (scratch->extensions & EXT_RANDOM_FOOT) { ++#ifdef HAVE_SRAND_DETERMINISTIC ++ srand_deterministic(scratch->random_seed_base + scratch->footnote_to_print); ++#else + srand(scratch->random_seed_base + scratch->footnote_to_print); ++#endif /* HAVE_SRAND_DETERMINISTIC */ + random = rand() % 99999 + 1; + } else { + random = scratch->footnote_to_print; +@@ -604,7 +608,11 @@ void print_html_node(GString *out, node *n, scratch_pa + temp_node = node_for_count(scratch->used_notes, lev); + + if (scratch->extensions & EXT_RANDOM_FOOT) { ++#ifdef HAVE_SRAND_DETERMINISTIC ++ srand_deterministic(scratch->random_seed_base + lev); ++#else + srand(scratch->random_seed_base + lev); ++#endif /* HAVE_SRAND_DETERMINISTIC */ + random = rand() % 99999 + 1; + } else { + random = lev; +@@ -658,7 +666,11 @@ void print_html_node(GString *out, node *n, scratch_pa + fprintf(stderr, "matching cite found - %d\n",lev); + #endif + if (scratch->extensions & EXT_RANDOM_FOOT) { ++#ifdef HAVE_SRAND_DETERMINISTIC ++ srand_deterministic(scratch->random_seed_base + lev); ++#else + srand(scratch->random_seed_base + lev); ++#endif /* HAVE_SRAND_DETERMINISTIC */ + random = rand() % 99999 + 1; + } else { + random = lev; +@@ -951,7 +963,11 @@ void print_html_endnotes(GString *out, scratch_pad *sc + pad(out, 1, scratch); + + if (scratch->extensions & EXT_RANDOM_FOOT) { ++#ifdef HAVE_SRAND_DETERMINISTIC ++ srand_deterministic(scratch->random_seed_base + counter); ++#else + srand(scratch->random_seed_base + counter); ++#endif /* HAVE_SRAND_DETERMINISTIC */ + random = rand() % 99999 + 1; + } else { + random = counter; Index: patches/patch-src_latex_c =================================================================== RCS file: patches/patch-src_latex_c diff -N patches/patch-src_latex_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_latex_c 1 Oct 2016 18:11:36 -0000 @@ -0,0 +1,28 @@ +$OpenBSD$ + +Switch from strcat(3) to safer idiom, ensure bogus input doesn't result +in out of bounds pointer. +--- src/latex.c.orig Sat Oct 1 11:12:24 2016 ++++ src/latex.c Sat Oct 1 11:23:02 2016 +@@ -1219,16 +1219,16 @@ void print_latex_url(GString *out, char *str, scratch_ + char * correct_dimension_units(char *original) { + char *result; + int i; ++ size_t result_len; + + result = strdup(original); ++ result_len = strlen(result); + + for (i = 0; result[i]; i++) + result[i] = tolower(result[i]); + +- if (strstr(&result[strlen(result)-2],"px")) { +- result[strlen(result)-2] = '\0'; +- strcat(result, "pt"); +- } +- ++ if ((result_len > 1) && strstr(&result[result_len-2],"px")) ++ result[result_len-1] = 't'; ++ + return result; + } Index: patches/patch-src_multimarkdown_c =================================================================== RCS file: patches/patch-src_multimarkdown_c diff -N patches/patch-src_multimarkdown_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_multimarkdown_c 1 Oct 2016 18:11:36 -0000 @@ -0,0 +1,25 @@ +$OpenBSD$ + +Use pledge(2) on OpenBSD. +--- src/multimarkdown.c.orig Fri Aug 5 09:08:36 2016 ++++ src/multimarkdown.c Thu Sep 15 17:28:27 2016 +@@ -58,6 +58,7 @@ + */ + + ++#include <errno.h> + #include <getopt.h> + #include <libgen.h> + #include "parser.h" +@@ -262,6 +263,11 @@ int main(int argc, char **argv) + abort(); + } + } ++ ++ if (pledge("stdio rpath wpath cpath", NULL) == -1) { ++ fprintf(stderr,"pledge: error #%d\n", errno); ++ exit(EXIT_FAILURE); ++ } + + /* Compatibility mode emulates the behavior of Markdown.pl */ + if (compatibility_flag) { Index: patches/patch-src_parse_utilities_c =================================================================== RCS file: patches/patch-src_parse_utilities_c diff -N patches/patch-src_parse_utilities_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_parse_utilities_c 1 Oct 2016 18:11:36 -0000 @@ -0,0 +1,31 @@ +$OpenBSD$ + +Use srand_deterministic(3) on OpenBSD +--- src/parse_utilities.c.orig Fri Aug 5 09:08:36 2016 ++++ src/parse_utilities.c Thu Sep 15 15:35:50 2016 +@@ -268,10 +268,18 @@ scratch_pad * mk_scratch_pad(unsigned long extensions) + result->inside_footnote = 0; + + if (extensions & EXT_RANDOM_FOOT) { ++#ifdef HAVE_SRAND_DETERMINISTIC ++ srand_deterministic((int)time(NULL)); ++#else + srand((int)time(NULL)); ++#endif /* HAVE_SRAND_DETERMINISTIC */ + result->random_seed_base = rand() % 32000; + } else { ++#ifdef HAVE_SRAND_DETERMINISTIC ++ srand_deterministic(1); ++#else + srand(1); ++#endif /* HAVE_SRAND_DETERMINISTIC */ + result->random_seed_base = 0; + } + ran_start(310952L); +@@ -909,4 +917,4 @@ char * my_strndup(const char * source, size_t n) { + result[len] = '\0'; + + return result; +-} +\ No newline at end of file ++} Index: patches/patch-src_parser_leg =================================================================== RCS file: patches/patch-src_parser_leg diff -N patches/patch-src_parser_leg --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_parser_leg 1 Oct 2016 18:11:36 -0000 @@ -0,0 +1,20 @@ +$OpenBSD$ + +Switch from sprintf(3) to safer idiom. Handle errors as elsewhere in code. +--- src/parser.leg.orig Fri Aug 5 09:08:36 2016 ++++ src/parser.leg Sat Oct 1 14:05:54 2016 +@@ -637,8 +637,12 @@ AutoLinkUrl = '<' < [A-Za-z]+ "://" ( !Newline !'>' + + AutoLinkEmail = '<' ( "mailto:" )? < [-A-Za-z0-9+_./!%~$]+ '@' ( !Newline !'>' . )+ > '>' + { +- char *mailto = malloc(strlen(yytext) + 8); +- sprintf(mailto, "mailto:%s", yytext); ++ char *mailto = NULL; ++ if (asprintf(&mailto, "mailto:%s", yytext) == -1) { ++ fprintf(stderr, "error copying mailto link: %s\n", ++ yytext); ++ exit(1); ++ } + $$ = mk_link(str(yytext), NULL, mailto, NULL, NULL); + free(mailto); + } Index: patches/patch-src_writer_c =================================================================== RCS file: patches/patch-src_writer_c diff -N patches/patch-src_writer_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_writer_c 1 Oct 2016 18:11:36 -0000 @@ -0,0 +1,43 @@ +$OpenBSD$ + +Switch from strcat(3) to a safer idiom, make sure bogus dimension does +not result in out of bounds pointer. +--- src/writer.c.orig Sat Oct 1 11:18:59 2016 ++++ src/writer.c Sat Oct 1 11:22:21 2016 +@@ -690,6 +690,7 @@ char * dimension_for_attribute(char *querystring, node + int i; + char *upper; + GString *result; ++ size_t dimension_len; + + attribute = node_for_attribute(querystring, list); + if (attribute == NULL) return NULL; +@@ -698,6 +699,7 @@ char * dimension_for_attribute(char *querystring, node + #endif + + dimension = strdup(attribute->children->str); ++ dimension_len = strlen(dimension); + upper = strdup(attribute->children->str); + + for(i = 0; dimension[ i ]; i++) +@@ -709,15 +711,14 @@ char * dimension_for_attribute(char *querystring, node + fprintf(stderr, "b\n"); + #endif + +- if (strstr(dimension, "px")) { +- ptr = strstr(dimension,"px"); +- ptr[0] = '\0'; +- strcat(ptr,"pt"); +- } ++ ptr = strstr(dimension,"px"); ++ if (ptr) ++ ptr[1] = 't'; + + result = g_string_new(dimension); + +- if ((strcmp(dimension,upper) == 0) && (dimension[strlen(dimension) -1] != '%')) { ++ if ((strcmp(dimension,upper) == 0) && (dimension_len > 0) && ++ (dimension[dimension_len-1] != '%')) { + /* no units */ + g_string_append_printf(result, "pt"); + } Index: patches/patch-writer_c =================================================================== RCS file: patches/patch-writer_c diff -N patches/patch-writer_c --- patches/patch-writer_c 24 Mar 2015 19:16:13 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,42 +0,0 @@ -$OpenBSD: patch-writer_c,v 1.1.1.1 2015/03/24 19:16:13 okan Exp $ - -Switch from strcat to a safer idiom. - ---- writer.c.orig Mon Mar 9 18:52:39 2015 -+++ writer.c Sat Mar 21 15:44:10 2015 -@@ -648,6 +648,7 @@ char * dimension_for_attribute(char *querystring, node - int i; - char *upper; - GString *result; -+ size_t dimension_len; - - attribute = node_for_attribute(querystring, list); - if (attribute == NULL) return NULL; -@@ -655,6 +656,7 @@ char * dimension_for_attribute(char *querystring, node - fprintf(stderr, "a\n"); - #endif - -+ dimension_len = strlen(attribute->children->str); - dimension = strdup(attribute->children->str); - upper = strdup(attribute->children->str); - -@@ -667,15 +669,13 @@ char * dimension_for_attribute(char *querystring, node - fprintf(stderr, "b\n"); - #endif - -- if (strstr(dimension, "px")) { -- ptr = strstr(dimension,"px"); -- ptr[0] = '\0'; -- strcat(ptr,"pt"); -- } -+ ptr = strstr(dimension, "px"); -+ if (ptr) -+ ptr[1] = 't'; - - result = g_string_new(dimension); - -- if ((strcmp(dimension,upper) == 0) && (dimension[strlen(dimension) -1] != '%')) { -+ if ((strcmp(dimension,upper) == 0) && (dimension[dimension_len-1] != '%')) { - /* no units */ - g_string_append_printf(result, "pt"); - }