From 9fbaf4fcfc7e1fea42c6a7081e2328dc3aaa9d64 Mon Sep 17 00:00:00 2001 From: konn Date: Wed, 23 Mar 2005 18:59:16 +0000 Subject: [PATCH] =?utf8?q?*=202005/3/24=20=20=20DOCTYPE=E3=81=8C=E5=AD=98?= =?utf8?q?=E5=9C=A8=E3=81=99=E3=82=8B=E5=A0=B4=E5=90=88=E3=80=81DOCTYPE?= =?utf8?q?=E3=81=AE=E5=AD=90=E3=83=8E=E3=83=BC=E3=83=89=E3=81=8C=E5=87=BA?= =?utf8?q?=E6=9D=A5=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92=E4=BF=AE?= =?utf8?q?=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * 2005/3/24 入力のHTMLがでたらめの場合、存在しないROOTノードの親ノードにアクセスしてしまう欠陥の修正。 git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/modchxj/mod_chxj/trunk@33 1a406e8e-add9-4483-a2c8-d8cac5b7c224 --- src/chxj_hdml.c | 4 +++- src/mod_chxj.h | 1 + src/qs_parse_string.c | 40 ++++++++++++++++++++++++++++++++++++++-- src/qs_parse_string.h | 5 +++++ src/qs_parse_tag.c | 3 ++- 5 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/chxj_hdml.c b/src/chxj_hdml.c index 09da18d4..81a6aacd 100644 --- a/src/chxj_hdml.c +++ b/src/chxj_hdml.c @@ -142,10 +142,12 @@ chxj_exchange_hdml(request_rec* r, /* Here, the parsing of the received character string is done */ /*------------------------------------------------------------------------*/ char *ss = apr_pstrdup(r->pool, src); + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "input srclen=[%d]\n", srclen); qs_init_malloc(&doc); qs_init_root_node(&doc); ss[srclen] = '\0'; - qs_parse_string(&doc,ss, strlen(ss)); + qs_parse_string(&doc, ss, srclen); /*------------------------------------------------------------------------*/ /* The number of radiobuttons is counted. */ diff --git a/src/mod_chxj.h b/src/mod_chxj.h index aed4a4ec..27cab842 100644 --- a/src/mod_chxj.h +++ b/src/mod_chxj.h @@ -81,6 +81,7 @@ typedef struct _mod_chxj_config_t device_table_list* devices; emoji_t* emoji; emoji_t* emoji_tail; + } mod_chxj_config; typedef struct _mod_chxj_global_config_t diff --git a/src/qs_parse_string.c b/src/qs_parse_string.c index 343a3b5f..fa38789f 100644 --- a/src/qs_parse_string.c +++ b/src/qs_parse_string.c @@ -16,6 +16,8 @@ */ #include #include +#include "httpd.h" +#include "http_log.h" #include "qs_malloc.h" #include "qs_parse_string.h" #include "qs_parse_tag.h" @@ -23,6 +25,7 @@ static int s_cut_tag (const char* s, int len) ; static int s_cut_text(const char* s, int len) ; +static void qs_dump_node(Doc* doc, Node* node, int indent); QS_EXPORT Node* @@ -61,13 +64,13 @@ qs_parse_string(Doc* doc, const char* src, int srclen) { { if (has_child(node->name)) { + if (doc->now_parent_node->parent != NULL) + { #ifdef DEBUG {char buf[256]; sprintf(buf, "[%s]->[%s]", doc->now_parent_node->name, doc->now_parent_node->parent->name); QX_LOGGER_DEBUG(buf);} #endif - if (doc->root_node != doc->now_parent_node) - { doc->now_parent_node = doc->now_parent_node->parent; } } @@ -116,9 +119,42 @@ qs_parse_string(Doc* doc, const char* src, int srclen) { QX_LOGGER_DEBUG("parse_string end"); #endif +#ifdef DEBUG + if (doc->r != NULL) + { + qs_dump_node(doc, doc->root_node, 0); + } +#endif + return doc->root_node; } +static void +qs_dump_node(Doc* doc, Node* node, int indent) { + Node* p = (Node*)qs_get_child_node(doc,node); + + for (;p;p = (Node*)qs_get_next_node(doc,p)) { + Attr* attr; + if ((char*)qs_get_node_value(doc,p) != NULL) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG,0, doc->r, + "%*.*sNode:[%s][%s]\n", indent,indent," ", + (char*)qs_get_node_name(doc,p), + (char*)qs_get_node_value(doc,p)); + } + else { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG,0, doc->r, + "%*.*sNode:[%s]\n", indent,indent," ", qs_get_node_name(doc,p)); + } + for (attr = (Attr*)qs_get_attr(doc,p); attr; attr = (Attr*)qs_get_next_attr(doc,attr)) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG,0, doc->r, + "%*.*s ATTR:[%s]\n", indent,indent," ", (char *)qs_get_attr_name(doc,attr)); + ap_log_rerror(APLOG_MARK, APLOG_DEBUG,0, doc->r, + "%*.*s VAL :[%s]\n", indent,indent," ", (char *)qs_get_attr_value(doc,attr)); + } + qs_dump_node(doc,p, indent+4); + } +} + static int diff --git a/src/qs_parse_string.h b/src/qs_parse_string.h index e797c005..d9ef5db4 100644 --- a/src/qs_parse_string.h +++ b/src/qs_parse_string.h @@ -17,6 +17,10 @@ #ifndef __QS_PARSE_STRING_H__ #define __QS_PARSE_STRING_H__ #include +/* +#define DEBUG +#define USE_LOG +*/ /** * Max of memory allocation times. */ @@ -73,6 +77,7 @@ && (strcasecmp(c, "p" ) != 0) \ && (strcasecmp(c, "plaintext") != 0) \ && (strcasecmp(c, "?xml" ) != 0) \ + && (strcasecmp(c, "!doctype" ) != 0) \ && (strcasecmp(c, "!--" ) != 0)) /** diff --git a/src/qs_parse_tag.c b/src/qs_parse_tag.c index 0ae81abb..b324381f 100644 --- a/src/qs_parse_tag.c +++ b/src/qs_parse_tag.c @@ -26,7 +26,8 @@ static char* s_get_tag_name(Doc* doc, const char* s, int len) ; QS_EXPORT Node* -qs_parse_tag(Doc* doc, const char* s, int len) { +qs_parse_tag(Doc* doc, const char* s, int len) +{ Node* node; char *tag_name; char *sp = (char*)s; -- 2.11.0