X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Fmod_dom.c;h=fd5986669becc8c40b9135c4816f064388cfce66;hp=e38a3c45d472f342bccec56d5e4f7b6cf5be198a;hb=a66b7d79383ae700f3358731eecfe2aafed0e90d;hpb=89d16cf15eda0e4802d18b8ad09bd3653508ebfc diff --git a/index/mod_dom.c b/index/mod_dom.c index e38a3c4..fd59866 100644 --- a/index/mod_dom.c +++ b/index/mod_dom.c @@ -1,5 +1,5 @@ /* This file is part of the Zebra server. - Copyright (C) 1994-2009 Index Data + Copyright (C) 1994-2010 Index Data Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -921,7 +921,13 @@ static void set_record_info(struct filter_info *tinfo, if (id_p && *id_p) - sscanf((const char *)id_p, "%255s", extctr->match_criteria); + { + size_t l = strlen(id_p); + if (l >= sizeof(extctr->match_criteria)) + l = sizeof(extctr->match_criteria)-1; + memcpy(extctr->match_criteria, id_p, l); + extctr->match_criteria[l] = '\0'; + } if (rank_p && *rank_p) extctr->staticrank = atozint((const char *)rank_p); @@ -1021,9 +1027,6 @@ static int attr_content_pi(const char **c_ptr, const char *name, const char *look = *c_ptr; int ret = 0; - *value = '\0'; - while (*look && ' ' == *look) - look++; if (strlen(look) > name_len) { if (look[name_len] == '=' && !memcmp(look, name, name_len)) @@ -1040,8 +1043,6 @@ static int attr_content_pi(const char **c_ptr, const char *name, ret = 1; } } - while (*look && ' ' == *look) - look++; *c_ptr = look; return ret; } @@ -1069,18 +1070,27 @@ static void process_xml_pi_node(struct filter_info *tinfo, *rank = '\0'; *type = '\0'; look += 6; - while (*look) + for (;;) + { + /* eat whitespace */ + while (' ' == *look) + look++; + if (*look == '\0') + break; if (attr_content_pi(&look, "id", id, sizeof(id))) ; else if (attr_content_pi(&look, "rank", rank, sizeof(rank))) ; else if (attr_content_pi(&look, "type", type, sizeof(type))) + ; + else { dom_log(YLOG_WARN, tinfo, node, "content '%s', can not parse '%s'", pi_p, look); break; } + } set_record_info(tinfo, extctr, node, id, rank, type); } /* parsing index instruction */ @@ -1418,7 +1428,8 @@ static int filter_extract(void *clientData, struct recExtractCtrl *p) static int ioread_ret(void *context, char *buffer, int len) { struct recRetrieveCtrl *p = context; - return p->stream->readf(p->stream, buffer, len); + int r = p->stream->readf(p->stream, buffer, len); + return r; } static int ioclose_ret(void *context) @@ -1456,7 +1467,7 @@ static int filter_retrieve(void *clientData, struct recRetrieveCtrl *p) { p->diagnostic = YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_; - p->addinfo = odr_strdup(p->odr, esn); + p->addinfo = odr_strdup_null(p->odr, esn); return 0; } @@ -1563,6 +1574,7 @@ idzebra_filter /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab