ports/131744: textproc/php5-xml generates wrong output.
Tsurutani Naoki
turutani at scphys.kyoto-u.ac.jp
Mon Feb 16 13:10:03 UTC 2009
>Number: 131744
>Category: ports
>Synopsis: textproc/php5-xml generates wrong output.
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Mon Feb 16 13:10:01 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator: Tsurutani Naoki
>Release: FreeBSD 7.1-STABLE i386
>Organization:
>Environment:
System: FreeBSD h120.65.226.10.32118.vlan.kuins.net 7.1-STABLE FreeBSD 7.1-STABLE #17: Wed Jan 7 11:14:01 JST 2009 turutani at h120.65.226.10.32118.vlan.kuins.net:/usr/local/work/usr/obj/usr/src/sys/POLYMER i386
>Description:
there is a bug of losing "<" and ">" in some cases.
this problem is reported on http://bugs.php.net/bug.php?id=45996 ,
and already fixed in php cvs trunk.
>How-To-Repeat:
install recent libxml2 and php5-xml (5.2.8).
>Fix:
here is a patch to textproc/php5-xml/files/patch-compat.c,
which should be removed after new release of 5.2.9:
--- patch-compat.c.orig 2004-07-20 18:03:42.000000000 +0900
+++ patch-compat.c 2009-02-16 11:20:48.000000000 +0900
@@ -1,9 +1,18 @@
---- compat.c.orig Tue Jul 20 10:55:02 2004
-+++ compat.c Tue Jul 20 10:55:55 2004
+--- compat.c.orig 2007-12-31 16:20:14.000000000 +0900
++++ compat.c 2009-01-13 00:45:21.000000000 +0900
+@@ -2,7 +2,7 @@
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+- | Copyright (c) 1997-2008 The PHP Group |
++ | Copyright (c) 1997-2009 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
@@ -16,6 +16,10 @@
+----------------------------------------------------------------------+
*/
-
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
@@ -11,3 +20,131 @@
#include "php.h"
#if defined(HAVE_LIBXML) && defined(HAVE_XML) && !defined(HAVE_LIBEXPAT)
#include "expat_compat.h"
+@@ -40,7 +44,7 @@
+ /* Use libxml functions otherwise its memory deallocation is screwed up */
+ *qualified = xmlStrdup(URI);
+ *qualified = xmlStrncat(*qualified, parser->_ns_seperator, 1);
+- *qualified = xmlStrncat(*qualified, name, strlen(name));
++ *qualified = xmlStrncat(*qualified, name, xmlStrlen(name));
+ } else {
+ *qualified = xmlStrdup(name);
+ }
+@@ -104,7 +108,66 @@
+ y = 0;
+ }
+
+- if (parser->h_start_element == NULL && parser->h_default == NULL) {
++ if (parser->h_start_element == NULL) {
++ if (parser->h_default) {
++
++ if (prefix) {
++ qualified_name = xmlStrncatNew((xmlChar *)"<", prefix, xmlStrlen(prefix));
++ qualified_name = xmlStrncat(qualified_name, (xmlChar *)":", 1);
++ qualified_name = xmlStrncat(qualified_name, name, xmlStrlen(name));
++ } else {
++ qualified_name = xmlStrncatNew((xmlChar *)"<", name, xmlStrlen(name));
++ }
++
++ if (namespaces) {
++ int i, j;
++ for (i = 0,j = 0;j < nb_namespaces;j++) {
++ int ns_len;
++ char *ns_string, *ns_prefix, *ns_url;
++
++ ns_prefix = (char *) namespaces[i++];
++ ns_url = (char *) namespaces[i++];
++
++ if (ns_prefix) {
++ ns_len = spprintf(&ns_string, 0, " xmlns:%s=\"%s\"", ns_prefix, ns_url);
++ } else {
++ ns_len = spprintf(&ns_string, 0, " xmlns=\"%s\"", ns_url);
++ }
++ qualified_name = xmlStrncat(qualified_name, (xmlChar *)ns_string, ns_len);
++
++ efree(ns_string);
++ }
++ }
++
++ if (attributes) {
++ for (i = 0; i < nb_attributes; i += 1) {
++ int att_len;
++ char *att_string, *att_name, *att_value, *att_prefix, *att_valueend;
++
++ att_name = (char *) attributes[y++];
++ att_prefix = (char *)attributes[y++];
++ y++;
++ att_value = (char *)attributes[y++];
++ att_valueend = (char *)attributes[y++];
++
++ if (att_prefix) {
++ att_len = spprintf(&att_string, 0, " %s:%s=\"", att_prefix, att_name);
++ } else {
++ att_len = spprintf(&att_string, 0, " %s=\"", att_name);
++ }
++
++ qualified_name = xmlStrncat(qualified_name, (xmlChar *)att_string, att_len);
++ qualified_name = xmlStrncat(qualified_name, (xmlChar *)att_value, att_valueend - att_value);
++ qualified_name = xmlStrncat(qualified_name, (xmlChar *)"\"", 1);
++
++ efree(att_string);
++ }
++
++ }
++ qualified_name = xmlStrncat(qualified_name, (xmlChar *)">", 1);
++ parser->h_default(parser->user, (const XML_Char *) qualified_name, xmlStrlen(qualified_name));
++ xmlFree(qualified_name);
++ }
+ return;
+ }
+ _qualify_namespace(parser, name, URI, &qualified_name);
+@@ -178,6 +241,18 @@
+ XML_Parser parser = (XML_Parser) user;
+
+ if (parser->h_end_element == NULL) {
++ if (parser->h_default) {
++ char *end_element;
++ int end_element_len;
++
++ if (prefix) {
++ end_element_len = spprintf(&end_element, 0, "</%s:%s>", (char *) prefix, (char *)name);
++ } else {
++ end_element_len = spprintf(&end_element, 0, "</%s>", (char *)name);
++ }
++ parser->h_default(parser->user, (const XML_Char *) end_element, end_element_len);
++ efree(end_element);
++ }
+ return;
+ }
+
+@@ -212,7 +287,7 @@
+ if (parser->h_default) {
+ char *full_pi;
+ spprintf(&full_pi, 0, "<?%s %s?>", (char *)target, (char *)data);
+- parser->h_default(parser->user, (const XML_Char *) full_pi, xmlStrlen(full_pi));
++ parser->h_default(parser->user, (const XML_Char *) full_pi, strlen(full_pi));
+ efree(full_pi);
+ }
+ return;
+@@ -411,6 +486,10 @@
+ parser->parser->charset = XML_CHAR_ENCODING_NONE;
+ #endif
+
++#if LIBXML_VERSION >= 20703
++ xmlCtxtUseOptions(parser->parser, XML_PARSE_OLDSAX);
++#endif
++
+ parser->parser->replaceEntities = 1;
+ parser->parser->wellFormed = 0;
+ if (sep != NULL) {
+@@ -545,10 +624,10 @@
+
+ static const XML_Char *const error_mapping[] = {
+ "No error",
+- "Internal error",
+ "No memory",
+ "Invalid document start",
+ "Empty document",
++ "Not well-formed (invalid token)",
+ "Invalid document end",
+ "Invalid hexadecimal character reference",
+ "Invalid decimal character reference",
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list