1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
commit d72dfdcf5722884a1fe79ea41343baa3673786a1
Author: Matthew Hague <matthewhague@zoho.com>
Date: Tue Mar 29 01:32:21 2016 +0100
fixed segfault causes by using current_vcard when parse doesn't match anything, changed file location tracking mechanism so that reading extra large vcards doesn't cause the parsing to fail early
diff --git a/src/vc_parse.y b/src/vc_parse.y
index b628b6b..e5d89cf 100644
--- a/src/vc_parse.y
+++ b/src/vc_parse.y
@@ -98,7 +98,7 @@ group_contentline
contentline
: name params ':' value '\n'
- | name ':' value '\n'
+ | name ':' value '\n'
;
name
@@ -160,15 +160,20 @@ vc_component *
parse_vcard_file (FILE * fp)
{
vc_component *vc = NULL;
+ current_vcard = NULL;
yyin = fp;
+ long pos = ftell(fp);
+ start_track_position(&pos);
+
if (0 == yyparse ())
{
vc = current_vcard;
}
-
- fseek(yyin, -chars_in_buffer(), SEEK_CUR);
+
+ fseek(yyin, pos, SEEK_SET);
+ stop_track_position();
flush_buffer();
return vc;
diff --git a/src/vc_scan.l b/src/vc_scan.l
index 6ea02dd..3fe6d71 100644
--- a/src/vc_scan.l
+++ b/src/vc_scan.l
@@ -24,14 +24,23 @@
#include "vc_parse.h"
/**
- * Two functions to enable only buffering one card at a time
+ * Functions to enable only buffering one card at a time
*/
-int chars_in_buffer()
- {
- return YY_CURRENT_BUFFER->yy_n_chars -
- (yytext - YY_CURRENT_BUFFER->yy_ch_buf);
- }
+long *track_pos = NULL;
+
+void start_track_position(long *pos) {
+ track_pos = pos;
+}
+
+void stop_track_position() {
+ track_pos = NULL;
+}
+
+static void move_pos(char *read) {
+ if (track_pos != NULL)
+ *track_pos += strlen(read);
+}
void flush_buffer()
{
@@ -62,36 +71,75 @@ NAME-CHAR [\x21-\x2B\x2D\x2F-\x39\x3C\x3E-\x5A\x5C\x5E-\x7E]
%%
-"BEGIN:VCARD" { yylval = NULL; return TOK_BEGIN_VCARD; }
-"END:VCARD" { yylval = NULL; return TOK_END_VCARD; }
-"\n" { yylval = NULL; return yytext[0]; }
-"." { yylval = NULL; return yytext[0]; }
-({ALPHA}|{DIGIT}|-)+/"." { yylval = yytext; return TOK_GROUP; }
-{NAME-CHAR}+ { yylval = yytext; return TOK_NAME; }
-";" { yylval = NULL; BEGIN(SC_PARAM); return yytext[0]; }
-":" { yylval = NULL; BEGIN(SC_VALUE); return yytext[0]; }
+"BEGIN:VCARD" { move_pos("BEGIN:VCARD");
+ yylval = NULL;
+ return TOK_BEGIN_VCARD; }
+"END:VCARD" { move_pos("END:VCARD");
+ yylval = NULL;
+ return TOK_END_VCARD; }
+"\n" { move_pos("\n"); yylval = NULL; return yytext[0]; }
+"." { move_pos("."); yylval = NULL; return yytext[0]; }
+({ALPHA}|{DIGIT}|-)+/"." { move_pos(yytext);
+ yylval = yytext;
+ return TOK_GROUP; }
+{NAME-CHAR}+ { move_pos(yytext);
+ yylval = yytext;
+ return TOK_NAME; }
+";" { move_pos(";");
+ yylval = NULL;
+ BEGIN(SC_PARAM);
+ return yytext[0]; }
+":" { move_pos(":");
+ yylval = NULL;
+ BEGIN(SC_VALUE);
+ return yytext[0]; }
<SC_VALUE>
{
-({VALUE-CHAR}|"\n ")* { yylval = yytext; return TOK_VALUE; }
-"\n" { yylval = NULL; BEGIN(INITIAL); return yytext[0]; }
+({VALUE-CHAR}|"\n ")* { move_pos(yytext);
+ yylval = yytext;
+ return TOK_VALUE; }
+"\n" { move_pos("\n");
+ yylval = NULL;
+ BEGIN(INITIAL);
+ return yytext[0]; }
}
<SC_PARAM>
{
-({ALPHA}|{DIGIT}|-)+ { yylval = yytext; return TOK_PARAM_NAME; }
-"=" { yylval = NULL; BEGIN(SC_PARAM_VALUE);
+({ALPHA}|{DIGIT}|-)+ { move_pos(yytext);
+ yylval = yytext;
+ return TOK_PARAM_NAME; }
+"=" { move_pos("=");
+ yylval = NULL;
+ BEGIN(SC_PARAM_VALUE);
+ return yytext[0]; }
+";" { move_pos(";");
+ yylval = NULL;
+ BEGIN(SC_PARAM);
+ return yytext[0]; }
+":" { move_pos(":");
+ yylval = NULL;
+ BEGIN(SC_VALUE);
return yytext[0]; }
-";" { yylval = NULL; BEGIN(SC_PARAM); return yytext[0]; }
-":" { yylval = NULL; BEGIN(SC_VALUE); return yytext[0]; }
}
<SC_PARAM_VALUE>
{
-{SAFE-CHAR}* { yylval = yytext; return TOK_PARAM_VALUE; }
-"," { yylval = NULL; return yytext[0]; }
-";" { yylval = NULL; BEGIN(SC_PARAM); return yytext[0]; }
-":" { yylval = NULL; BEGIN(SC_VALUE); return yytext[0]; }
+{SAFE-CHAR}* { move_pos(yytext);
+ yylval = yytext;
+ return TOK_PARAM_VALUE; }
+"," { move_pos(",");
+ yylval = NULL;
+ return yytext[0]; }
+";" { move_pos(";");
+ yylval = NULL;
+ BEGIN(SC_PARAM);
+ return yytext[0]; }
+":" { move_pos(":");
+ yylval = NULL;
+ BEGIN(SC_VALUE);
+ return yytext[0]; }
}
%%
|