commit 568d5276e059fed085dc5ff179b9db820793f965
parent 0b531f2204d5a3504b0dfaf8f96a486a229a917b
Author: ukai <ukai>
Date: Sat, 21 Dec 2002 16:16:43 +0000
[w3m-dev 03593] Re: segmentation fault when <title> exist after <img>
* file.c (cur_title): added
(save_obuf): deleted
(process_title): added
(process_n_title): added
(feed_title): added
(HTMLtagproc1): rewrite HTML_TITLE, HTML_N_TITLE,
HTML_TITLE_ALT, HTML_N_HEAD, HTML_HEAD
(HTMLlineproc0): check RB_TITLE
(completeHTMLstream): add RB_TITLE
(loadHTMLstream): initialize cur_title
From: Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>
Diffstat:
M | ChangeLog | | | 14 | ++++++++++++++ |
M | file.c | | | 91 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------- |
2 files changed, 84 insertions(+), 21 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -1,3 +1,17 @@
+2002-12-22 Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>
+
+ * [w3m-dev 03593] Re: segmentation fault when <title> exist after <img>
+ * file.c (cur_title): added
+ (save_obuf): deleted
+ (process_title): added
+ (process_n_title): added
+ (feed_title): added
+ (HTMLtagproc1): rewrite HTML_TITLE, HTML_N_TITLE,
+ HTML_TITLE_ALT, HTML_N_HEAD, HTML_HEAD
+ (HTMLlineproc0): check RB_TITLE
+ (completeHTMLstream): add RB_TITLE
+ (loadHTMLstream): initialize cur_title
+
2002-12-21 Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>
* [w3m-dev 03590] segmentation fault when <title> exist after <img>
diff --git a/file.c b/file.c
@@ -59,6 +59,7 @@ static char cur_document_code;
#endif
#endif
+static Str cur_title;
static Str cur_select;
static Str select_str;
static int select_is_multiple;
@@ -95,8 +96,6 @@ static char check_charset(char *s);
static char check_accept_charset(char *s);
#endif
-static struct readbuffer save_obuf;
-
struct link_stack {
int cmd;
short offset;
@@ -2939,6 +2938,45 @@ restore_fonteffect(struct html_feed_environ *h_env, struct readbuffer *obuf)
push_tag(obuf, "<u>", HTML_U);
}
+static Str
+process_title(struct parsed_tag *tag)
+{
+ cur_title = Strnew();
+ return NULL;
+}
+
+static Str
+process_n_title(struct parsed_tag *tag)
+{
+ Str tmp;
+
+ if (!cur_title)
+ return NULL;
+ Strremovefirstspaces(cur_title);
+ Strremovetrailingspaces(cur_title);
+ tmp = Strnew_m_charp("<title_alt title=\"",
+ html_quote(cur_title->ptr), "\">", NULL);
+ cur_title = NULL;
+ return tmp;
+}
+
+static void
+feed_title(char *str)
+{
+ if (!cur_title)
+ return;
+ while (*str) {
+ if (*str == '&')
+ Strcat_charp(cur_title, getescapecmd(&str));
+ else if (*str == '\n' || *str == '\r') {
+ Strcat_char(cur_title, ' ');
+ str++;
+ }
+ else
+ Strcat_char(cur_title, *(str++));
+ }
+}
+
Str
process_img(struct parsed_tag *tag, int width)
{
@@ -4299,27 +4337,24 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
/* obuf->flag |= RB_IGNORE_P; */
return 1;
case HTML_TITLE:
- append_tags(obuf);
- set_breakpoint(obuf, 0);
- bcopy((void *)obuf, (void *)&save_obuf, sizeof(struct readbuffer));
- obuf->line = Strnew();
- discardline(obuf, 0);
- obuf->flag |= (RB_NOBR | RB_TITLE);
+ close_anchor(h_env, obuf);
+ process_title(tag);
+ obuf->flag |= RB_TITLE;
+ obuf->end_tag = HTML_N_TITLE;
return 1;
case HTML_N_TITLE:
if (!(obuf->flag & RB_TITLE))
return 1;
- obuf->flag &= ~(RB_NOBR | RB_TITLE);
- tmp = Strnew_charp(obuf->line->ptr);
- Strremovetrailingspaces(tmp);
- h_env->title = html_unquote(tmp->ptr);
- bcopy((void *)&save_obuf, (void *)obuf, sizeof(struct readbuffer));
- append_tags(obuf);
- back_to_breakpoint(obuf);
- tmp = Strnew_m_charp("<title_alt title=\"",
- html_quote(h_env->title), "\">", NULL);
- push_tag(obuf, tmp->ptr, HTML_TITLE_ALT);
+ obuf->flag &= ~RB_TITLE;
+ obuf->end_tag = 0;
+ tmp = process_n_title(tag);
+ if (tmp)
+ HTMLlineproc1(tmp->ptr, h_env);
return 1;
+ case HTML_TITLE_ALT:
+ if (parsedtag_get_value(tag, ATTR_TITLE, &p))
+ h_env->title = html_unquote(p);
+ return 0;
case HTML_FRAMESET:
PUSH_ENV(cmd);
push_charp(obuf, 9, "--FRAME--", PC_ASCII);
@@ -4849,6 +4884,10 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
HTMLlineproc1(s->ptr, h_env);
}
}
+ case HTML_N_HEAD:
+ if (obuf->flag & RB_TITLE)
+ HTMLlineproc1("</title>", h_env);
+ case HTML_HEAD:
case HTML_N_BODY:
return 1;
default:
@@ -5652,7 +5691,7 @@ HTMLlineproc0(char *line, struct html_feed_environ *h_env, int internal)
if (str[1] && REALLY_THE_BEGINNING_OF_A_TAG(str))
is_tag = TRUE;
else if (!(pre_mode & (RB_PLAIN | RB_INTXTA | RB_INSELECT |
- RB_SCRIPT | RB_STYLE))) {
+ RB_SCRIPT | RB_STYLE | RB_TITLE))) {
line = Strnew_m_charp(str + 1, line, NULL)->ptr;
str = "<";
}
@@ -5666,15 +5705,22 @@ HTMLlineproc0(char *line, struct html_feed_environ *h_env, int internal)
}
if (pre_mode & (RB_PLAIN | RB_INTXTA | RB_INSELECT | RB_SCRIPT |
- RB_STYLE)) {
+ RB_STYLE | RB_TITLE)) {
if (is_tag) {
p = str;
if ((tag = parse_tag(&p, internal))) {
if (tag->tagid == end_tag ||
- (pre_mode & RB_INSELECT && tag->tagid == HTML_N_FORM))
+ (pre_mode & RB_INSELECT && tag->tagid == HTML_N_FORM) ||
+ (pre_mode & RB_TITLE && (tag->tagid == HTML_N_HEAD ||
+ tag->tagid == HTML_BODY)))
goto proc_normal;
}
}
+ /* title */
+ if (pre_mode & RB_TITLE) {
+ feed_title(str);
+ continue;
+ }
/* select */
if (pre_mode & RB_INSELECT) {
if (obuf->table_level >= 0)
@@ -6210,6 +6256,8 @@ completeHTMLstream(struct html_feed_environ *h_env, struct readbuffer *obuf)
/* for unbalanced select tag */
if (obuf->flag & RB_INSELECT)
HTMLlineproc1("</select>", h_env);
+ if (obuf->flag & RB_TITLE)
+ HTMLlineproc1("</title>", h_env);
/* for unbalanced table tag */
while (obuf->table_level >= 0) {
@@ -6312,6 +6360,7 @@ loadHTMLstream(URLFile *f, Buffer *newBuf, FILE * src, int internal)
#endif
MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
+ cur_title = NULL;
n_textarea = 0;
cur_textarea = NULL;
max_textarea = MAX_TEXTAREA;