ox 2.0.2 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ox might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ae0dbc4e3a17970ece45a543a56181be5218e13f
4
- data.tar.gz: a667157d26ff14f45d54cdc64b1f7f74a9dac965
3
+ metadata.gz: 9d03526c81d518faeee16a0866d7dcd58652cbb8
4
+ data.tar.gz: 606f087bcfadf31e8f3800424a7253bfee95dc17
5
5
  SHA512:
6
- metadata.gz: 59334b95d88b70fe553ad03fd12adcb7c53d80aa04f743516515c841cb350aabad840a836b97a775c5da417e07a89047780ddfa2d5452ac06a311131ebf04fc4
7
- data.tar.gz: 88c8e2abf0cdd10f738b43561b0b2ee4bd471540e6120f75aaa0499fa7a04634b16a2f71215786667229cb04e47716a87d1e2d9f76098c25d74a32448e010885
6
+ metadata.gz: decaadbf4e7024b3fbaef0694c49695d6c77739b617a8d24a63ed32f736f2cd4090d84ae1c0cfea2d32b7ef6419575b2b17c74672c96e3c995c1cb978095da44
7
+ data.tar.gz: 17fff8235ae614cc166d867c8fb983b953cb3bc2bc6e72a1f056f52d453c09516201199034c894843d3cb691f1cc8a3b4f01688e98737b1f4598c9e76a188721
data/README.md CHANGED
@@ -34,9 +34,9 @@ A fast XML parser and Object marshaller as a Ruby gem.
34
34
 
35
35
  ## <a name="release">Release Notes</a>
36
36
 
37
- ### Release 2.0.2
37
+ ### Release 2.0.3
38
38
 
39
- - Fixed buffer sliding window off by 1 error in the SAX parser.
39
+ - Fixed excessive memory allocation issue for very large file parsing (half a gig).
40
40
 
41
41
  ## <a name="description">Description</a>
42
42
 
data/ext/ox/sax.c CHANGED
@@ -188,8 +188,8 @@ ox_sax_drive_error_at(SaxDrive dr, const char *msg, int line, int col) {
188
188
  VALUE args[3];
189
189
 
190
190
  args[0] = rb_str_new2(msg);
191
- args[1] = INT2FIX(line);
192
- args[2] = INT2FIX(col);
191
+ args[1] = LONG2NUM(line);
192
+ args[2] = LONG2NUM(col);
193
193
  if (dr->has.line) {
194
194
  rb_ivar_set(dr->handler, ox_at_line_id, args[1]);
195
195
  }
@@ -331,10 +331,10 @@ parse(SaxDrive dr) {
331
331
  Nv sp;
332
332
 
333
333
  if (dr->has.line) {
334
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(dr->buf.line));
334
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(dr->buf.line));
335
335
  }
336
336
  if (dr->has.column) {
337
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(dr->buf.col));
337
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(dr->buf.col));
338
338
  }
339
339
  for (sp = dr->stack.tail - 1; dr->stack.head <= sp; sp--) {
340
340
  snprintf(msg, sizeof(msg) - 1, "%selement '%s' not closed", EL_MISMATCH, sp->name);
@@ -400,10 +400,10 @@ read_instruction(SaxDrive dr) {
400
400
  VALUE args[1];
401
401
 
402
402
  if (dr->has.line) {
403
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(line));
403
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line));
404
404
  }
405
405
  if (dr->has.column) {
406
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(col));
406
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col));
407
407
  }
408
408
  args[0] = target;
409
409
  rb_funcall2(dr->handler, ox_instruct_id, 1, args);
@@ -437,10 +437,10 @@ read_instruction(SaxDrive dr) {
437
437
  }
438
438
  #endif
439
439
  if (dr->has.line) {
440
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(line));
440
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line));
441
441
  }
442
442
  if (dr->has.column) {
443
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(col));
443
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col));
444
444
  }
445
445
  rb_funcall2(dr->handler, ox_text_id, 1, args);
446
446
  }
@@ -463,10 +463,10 @@ read_instruction(SaxDrive dr) {
463
463
  VALUE args[1];
464
464
 
465
465
  if (dr->has.line) {
466
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(line));
466
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line));
467
467
  }
468
468
  if (dr->has.column) {
469
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(col));
469
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col));
470
470
  }
471
471
  args[0] = target;
472
472
  rb_funcall2(dr->handler, ox_end_instruct_id, 1, args);
@@ -504,10 +504,10 @@ read_doctype(SaxDrive dr) {
504
504
  VALUE args[1];
505
505
 
506
506
  if (dr->has.line) {
507
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(line));
507
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line));
508
508
  }
509
509
  if (dr->has.column) {
510
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(col));
510
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col));
511
511
  }
512
512
  args[0] = rb_str_new2(dr->buf.str);
513
513
  rb_funcall2(dr->handler, ox_doctype_id, 1, args);
@@ -584,10 +584,10 @@ read_cdata(SaxDrive dr) {
584
584
  }
585
585
  #endif
586
586
  if (dr->has.line) {
587
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(line));
587
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line));
588
588
  }
589
589
  if (dr->has.column) {
590
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(col));
590
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col));
591
591
  }
592
592
  rb_funcall2(dr->handler, ox_cdata_id, 1, args);
593
593
  }
@@ -663,10 +663,10 @@ read_comment(SaxDrive dr) {
663
663
  }
664
664
  #endif
665
665
  if (dr->has.line) {
666
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(line));
666
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line));
667
667
  }
668
668
  if (dr->has.column) {
669
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(col));
669
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col));
670
670
  }
671
671
  rb_funcall2(dr->handler, ox_comment_id, 1, args);
672
672
  }
@@ -744,10 +744,10 @@ read_element_start(SaxDrive dr) {
744
744
  VALUE args[1];
745
745
 
746
746
  if (dr->has.line) {
747
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(line));
747
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line));
748
748
  }
749
749
  if (dr->has.column) {
750
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(col));
750
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col));
751
751
  }
752
752
  args[0] = name;
753
753
  rb_funcall2(dr->handler, ox_start_element_id, 1, args);
@@ -839,10 +839,10 @@ read_element_end(SaxDrive dr) {
839
839
  VALUE args[1];
840
840
 
841
841
  if (dr->has.line) {
842
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(line));
842
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line));
843
843
  }
844
844
  if (dr->has.column) {
845
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(col));
845
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col));
846
846
  }
847
847
  args[0] = name;
848
848
  rb_funcall2(dr->handler, ox_start_element_id, 1, args);
@@ -858,10 +858,10 @@ read_element_end(SaxDrive dr) {
858
858
  snprintf(msg, sizeof(msg) - 1, "%selement '%s' close does not match '%s' open", EL_MISMATCH, dr->buf.str, nv->name);
859
859
  ox_sax_drive_error_at(dr, msg, line, col);
860
860
  if (dr->has.line) {
861
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(line));
861
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line));
862
862
  }
863
863
  if (dr->has.column) {
864
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(col));
864
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col));
865
865
  }
866
866
  for (nv = stack_pop(&dr->stack); match < nv; nv = stack_pop(&dr->stack)) {
867
867
  if (dr->has.end_element) {
@@ -898,10 +898,10 @@ read_text(SaxDrive dr) {
898
898
  VALUE args[1];
899
899
 
900
900
  if (dr->has.line) {
901
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(line));
901
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line));
902
902
  }
903
903
  if (dr->has.column) {
904
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(col));
904
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col));
905
905
  }
906
906
  *args = dr->value_obj;
907
907
  rb_funcall2(dr->handler, ox_value_id, 1, args);
@@ -922,10 +922,10 @@ read_text(SaxDrive dr) {
922
922
  }
923
923
  #endif
924
924
  if (dr->has.line) {
925
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(line));
925
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line));
926
926
  }
927
927
  if (dr->has.column) {
928
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(col));
928
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col));
929
929
  }
930
930
  rb_funcall2(dr->handler, ox_text_id, 1, args);
931
931
  }
@@ -994,10 +994,10 @@ read_attrs(SaxDrive dr, char c, char termc, char term2, int is_xml, int eq_req)
994
994
  VALUE args[2];
995
995
 
996
996
  if (dr->has.line) {
997
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(line));
997
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line));
998
998
  }
999
999
  if (dr->has.column) {
1000
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(col));
1000
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col));
1001
1001
  }
1002
1002
  args[0] = name;
1003
1003
  args[1] = dr->value_obj;
@@ -1018,10 +1018,10 @@ read_attrs(SaxDrive dr, char c, char termc, char term2, int is_xml, int eq_req)
1018
1018
  }
1019
1019
  #endif
1020
1020
  if (dr->has.line) {
1021
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(line));
1021
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line));
1022
1022
  }
1023
1023
  if (dr->has.column) {
1024
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(col));
1024
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col));
1025
1025
  }
1026
1026
  rb_funcall2(dr->handler, ox_attr_id, 2, args);
1027
1027
  }
@@ -1239,10 +1239,10 @@ static void
1239
1239
  end_element_cb(SaxDrive dr, VALUE name, int line, int col) {
1240
1240
  if (dr->has.end_element) {
1241
1241
  if (dr->has.line) {
1242
- rb_ivar_set(dr->handler, ox_at_line_id, INT2FIX(line));
1242
+ rb_ivar_set(dr->handler, ox_at_line_id, LONG2NUM(line));
1243
1243
  }
1244
1244
  if (dr->has.column) {
1245
- rb_ivar_set(dr->handler, ox_at_column_id, INT2FIX(col));
1245
+ rb_ivar_set(dr->handler, ox_at_column_id, LONG2NUM(col));
1246
1246
  }
1247
1247
  rb_funcall(dr->handler, ox_end_element_id, 1, name);
1248
1248
  }
data/ext/ox/sax_buf.c CHANGED
@@ -114,7 +114,8 @@ ox_sax_buf_read(Buf buf) {
114
114
  int err;
115
115
  size_t shift = 0;
116
116
 
117
- if (buf->head < buf->tail) {
117
+ // if there is not much room to read into, shift or realloc a larger buffer.
118
+ if (buf->head < buf->tail && 4096 > buf->end - buf->tail) {
118
119
  if (0 == buf->pro) {
119
120
  shift = buf->tail - buf->head;
120
121
  } else {
@@ -170,7 +171,7 @@ rescue_cb(VALUE rbuf, VALUE err) {
170
171
  #endif
171
172
  Buf buf = (Buf)rbuf;
172
173
 
173
- ox_sax_drive_cleanup(buf->dr);
174
+ //ox_sax_drive_cleanup(buf->dr); called after exiting protect
174
175
  rb_raise(err, "at line %d, column %d\n", buf->line, buf->col);
175
176
  }
176
177
  #endif
@@ -189,7 +190,7 @@ partial_io_cb(VALUE rbuf) {
189
190
  rstr = rb_funcall2(buf->io, ox_readpartial_id, 1, args);
190
191
  str = StringValuePtr(rstr);
191
192
  cnt = strlen(str);
192
- /*printf("*** read %lu bytes, str: '%s'\n", cnt, str); */
193
+ //printf("*** read %lu bytes, str: '%s'\n", cnt, str);
193
194
  strcpy(buf->tail, str);
194
195
  buf->read_end = buf->tail + cnt;
195
196
 
data/ext/ox/sax_buf.h CHANGED
@@ -153,8 +153,9 @@ buf_next_white(Buf buf) {
153
153
 
154
154
  static inline void
155
155
  buf_cleanup(Buf buf) {
156
- if (buf->base != buf->head) {
156
+ if (buf->base != buf->head && 0 != buf->head) {
157
157
  xfree(buf->head);
158
+ buf->head = 0;
158
159
  }
159
160
  }
160
161
 
data/lib/ox/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Ox
3
3
  # Current version of the module.
4
- VERSION = '2.0.2'
4
+ VERSION = '2.0.3'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ox
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Ohler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-07 00:00:00.000000000 Z
11
+ date: 2013-06-12 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: "A fast XML parser and object serializer that uses only standard C lib.\n
14
14
  \ \nOptimized XML (Ox), as the name implies was written to provide speed