ox 2.14.23 → 2.14.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e074f178c4058fb2730b3472d9ba87a2f2b6491de903f139f1d5ec4f4fc68145
4
- data.tar.gz: a3ebe7df1b9b582b9d930530af72c4907caad822a3f67f52e55d0ef9647e3685
3
+ metadata.gz: 1fdd6c47d31f46414501f3719dc4b3b0c938517cbd0a03f982110657b3b7261b
4
+ data.tar.gz: 9d65bf85bc88e0421049230251ed87a2dfa078c0e2be5ab61b5da63f148d52e4
5
5
  SHA512:
6
- metadata.gz: faafbda1d85eb0a6ce1ed406fcdd666ba0c4325356080a992f35f1f7979911365e5845e963934aea970af2cfe8765c4d37c044b624a3a3dbfe06245d17d1f333
7
- data.tar.gz: 8a712e6a78fbd9c60f0a209c2bc9b52c00f2f2ef31b066685bb9115b5d81a6ef296e5b8aa44b4060a0a9f5c8e95fd5a54eab7ca8daae09d3b7746a243b098237
6
+ metadata.gz: a82cba42c5957d123ea2022f8cce3f65923c31f96b1ff67c176a75f538fef35e3d58585ba232fc972a7a41e94386a72cdec9fd16f341cbd080ea1d1c1de04fc1
7
+ data.tar.gz: 255570365253191fbe23824dbdc9262162dcea2fd5b297bc182ea2fd4eff25ecc4bc8484cadf56c3c4c5cee4fac2d0589140ee2d2d5e7f395f6e2edaf487cfe3
data/CHANGELOG.md CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
  All changes to the Ox gem are documented here. Releases follow semantic versioning.
4
4
 
5
+ ## [2.14.25] - 2026-04-23
6
+
7
+ ### Added
8
+
9
+ - Contribution by @albanpeignier
10
+
11
+ ### Fixed
12
+
13
+ - Parser buffer overflow fix by @albanpeignier
14
+
15
+ ## [2.14.24] - 2026-04-20
16
+
17
+ ### Fixed
18
+
19
+ - Bundler load issue #389
20
+
5
21
  ## [2.14.23] - 2025-05-27
6
22
 
7
23
  ### Changed
data/ext/ox/extconf.rb CHANGED
@@ -32,6 +32,16 @@ CONFIG['warnflags'].slice!(/ -Wsuggest-attribute=format/)
32
32
  CONFIG['warnflags'].slice!(/ -Wdeclaration-after-statement/)
33
33
  CONFIG['warnflags'].slice!(/ -Wmissing-noreturn/)
34
34
 
35
+ if ENV['OX_ASAN'] || ENV['OX_DEBUG']
36
+ CONFIG["optflags"] = "-O0"
37
+ CONFIG["debugflags"] = "-ggdb3"
38
+ end
39
+
40
+ if ENV['OX_ASAN']
41
+ $LDFLAGS << " -fsanitize=address"
42
+ $CFLAGS << " -fsanitize=address"
43
+ end
44
+
35
45
  have_func('rb_ext_ractor_safe', 'ruby.h')
36
46
  have_func('pthread_mutex_init')
37
47
  have_func('rb_enc_interned_str')
@@ -42,6 +52,6 @@ have_header('sys/uio.h')
42
52
 
43
53
  have_struct_member('struct tm', 'tm_gmtoff')
44
54
 
45
- create_makefile(extension_name)
55
+ create_makefile("ox/#{extension_name}")
46
56
 
47
57
  `make clean`
data/ext/ox/foo.h ADDED
@@ -0,0 +1,204 @@
1
+ /* sax_buf.h
2
+ * Copyright (c) 2011, Peter Ohler
3
+ * All rights reserved.
4
+ */
5
+
6
+ #ifndef OX_SAX_BUF_H
7
+ #define OX_SAX_BUF_H
8
+
9
+ #include <stdio.h>
10
+
11
+ typedef struct _buf {
12
+ char base[0x00001000];
13
+ char *head;
14
+ char *end;
15
+ char *tail;
16
+ char *read_end; /* one past last character read */
17
+ char *pro; /* protection start, buffer can not slide past this point */
18
+ char *str; /* start of current string being read */
19
+ off_t pos;
20
+ off_t line;
21
+ off_t col;
22
+ off_t pro_pos;
23
+ off_t pro_line;
24
+ off_t pro_col;
25
+ int (*read_func)(struct _buf *buf);
26
+ union {
27
+ int fd;
28
+ VALUE io;
29
+ const char *str;
30
+ } in;
31
+ struct _saxDrive *dr;
32
+ } *Buf;
33
+
34
+ typedef struct _checkPt {
35
+ off_t pro_dif;
36
+ off_t pos;
37
+ off_t line;
38
+ off_t col;
39
+ char c;
40
+ } *CheckPt;
41
+
42
+ #define CHECK_PT_INIT {-1, 0, 0, 0, '\0'}
43
+
44
+ extern void ox_sax_buf_init(Buf buf, VALUE io);
45
+ extern int ox_sax_buf_read(Buf buf);
46
+
47
+ static inline char buf_get(Buf buf) {
48
+ // printf("*** drive get from '%s' from start: %ld buf: %p from read_end: %ld\n", buf->tail, buf->tail -
49
+ // buf->head, buf->head, buf->read_end - buf->tail);
50
+ if (buf->read_end <= buf->tail) {
51
+ if (0 != ox_sax_buf_read(buf)) {
52
+ return '\0';
53
+ }
54
+ }
55
+ if ('\n' == *buf->tail) {
56
+ buf->line++;
57
+ buf->col = 0;
58
+ } else {
59
+ buf->col++;
60
+ }
61
+ buf->pos++;
62
+
63
+ return *buf->tail++;
64
+ }
65
+
66
+ static inline void buf_backup(Buf buf) {
67
+ buf->tail--;
68
+ buf->col--;
69
+ buf->pos--;
70
+ if (0 >= buf->col) {
71
+ buf->line--;
72
+ // allow col to be negative since we never backup twice in a row
73
+ }
74
+ }
75
+
76
+ static inline void buf_protect(Buf buf) {
77
+ buf->pro = buf->tail;
78
+ buf->str = buf->tail; // can't have str before pro
79
+ buf->pro_pos = buf->pos;
80
+ buf->pro_line = buf->line;
81
+ buf->pro_col = buf->col;
82
+ }
83
+
84
+ static inline void buf_reset(Buf buf) {
85
+ buf->tail = buf->pro;
86
+ buf->pos = buf->pro_pos;
87
+ buf->line = buf->pro_line;
88
+ buf->col = buf->pro_col;
89
+ }
90
+
91
+ /* Starts by reading a character so it is safe to use with an empty or
92
+ * compacted buffer.
93
+ */
94
+ static inline char buf_next_non_white(Buf buf) {
95
+ char c;
96
+
97
+ while ('\0' != (c = buf_get(buf))) {
98
+ switch (c) {
99
+ case ' ':
100
+ case '\t':
101
+ case '\f':
102
+ case '\n':
103
+ case '\r': break;
104
+ default: return c;
105
+ }
106
+ }
107
+ return '\0';
108
+ }
109
+
110
+ /* Starts by reading a character so it is safe to use with an empty or
111
+ * compacted buffer.
112
+ */
113
+ static inline char buf_next_white(Buf buf) {
114
+ char c;
115
+
116
+ while ('\0' != (c = buf_get(buf))) {
117
+ switch (c) {
118
+ case ' ':
119
+ case '\t':
120
+ case '\f':
121
+ case '\n':
122
+ case '\r':
123
+ case '\0': return c;
124
+ default: break;
125
+ }
126
+ }
127
+ return '\0';
128
+ }
129
+
130
+ static inline void buf_cleanup(Buf buf) {
131
+ if (buf->base != buf->head && 0 != buf->head) {
132
+ xfree(buf->head);
133
+ buf->head = 0;
134
+ }
135
+ }
136
+
137
+ static inline int is_white(char c) {
138
+ switch (c) {
139
+ case ' ':
140
+ case '\t':
141
+ case '\f':
142
+ case '\n':
143
+ case '\r': return 1;
144
+ default: break;
145
+ }
146
+ return 0;
147
+ }
148
+
149
+ static inline void buf_checkpoint(Buf buf, CheckPt cp) {
150
+ cp->pro_dif = (int)(buf->tail - buf->pro);
151
+ cp->pos = buf->pos;
152
+ cp->line = buf->line;
153
+ cp->col = buf->col;
154
+ cp->c = *(buf->tail - 1);
155
+ }
156
+
157
+ static inline int buf_checkset(CheckPt cp) {
158
+ return (0 <= cp->pro_dif);
159
+ }
160
+
161
+ static inline char buf_checkback(Buf buf, CheckPt cp) {
162
+ buf->tail = buf->pro + cp->pro_dif;
163
+ buf->pos = cp->pos;
164
+ buf->line = cp->line;
165
+ buf->col = cp->col;
166
+ return cp->c;
167
+ }
168
+
169
+ static inline void buf_collapse_return(char *str) {
170
+ char *s = str;
171
+ char *back = str;
172
+
173
+ for (; '\0' != *s; s++) {
174
+ if (back != str && '\n' == *s && '\r' == *(back - 1)) {
175
+ *(back - 1) = '\n';
176
+ } else {
177
+ *back++ = *s;
178
+ }
179
+ }
180
+ *back = '\0';
181
+ }
182
+
183
+ static inline void buf_collapse_white(char *str) {
184
+ char *s = str;
185
+ char *back = str;
186
+
187
+ for (; '\0' != *s; s++) {
188
+ switch (*s) {
189
+ case ' ':
190
+ case '\t':
191
+ case '\f':
192
+ case '\n':
193
+ case '\r':
194
+ if (back == str || ' ' != *(back - 1)) {
195
+ *back++ = ' ';
196
+ }
197
+ break;
198
+ default: *back++ = *s; break;
199
+ }
200
+ }
201
+ *back = '\0';
202
+ }
203
+
204
+ #endif /* OX_SAX_BUF_H */
data/ext/ox/parse.c CHANGED
@@ -1171,7 +1171,7 @@ static int collapse_special(PInfo pi, char *str) {
1171
1171
  return EDOM;
1172
1172
  }
1173
1173
  if (kend <= k) {
1174
- k = key;
1174
+ k = key + 1; // because k-- follows
1175
1175
  break;
1176
1176
  }
1177
1177
  *k++ = *s;
data/lib/ox/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Ox
2
2
  # Current version of the module.
3
- VERSION = '2.14.23'
3
+ VERSION = '2.14.25'
4
4
  end
data/lib/ox.rb CHANGED
@@ -76,8 +76,4 @@ require 'ox/bag'
76
76
  require 'ox/sax'
77
77
 
78
78
  # C extension
79
- begin
80
- require_relative "ox.#{RbConfig::CONFIG['DLEXT']}"
81
- rescue LoadError
82
- require 'ox/ox'
83
- end
79
+ require 'ox/ox'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ox
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.14.23
4
+ version: 2.14.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Ohler
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-05-28 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: bigdecimal
@@ -32,8 +32,8 @@ executables: []
32
32
  extensions:
33
33
  - ext/ox/extconf.rb
34
34
  extra_rdoc_files:
35
- - README.md
36
35
  - CHANGELOG.md
36
+ - README.md
37
37
  files:
38
38
  - CHANGELOG.md
39
39
  - LICENSE
@@ -51,6 +51,7 @@ files:
51
51
  - ext/ox/err.c
52
52
  - ext/ox/err.h
53
53
  - ext/ox/extconf.rb
54
+ - ext/ox/foo.h
54
55
  - ext/ox/gen_load.c
55
56
  - ext/ox/hash_load.c
56
57
  - ext/ox/helper.h
@@ -122,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
123
  - !ruby/object:Gem::Version
123
124
  version: '0'
124
125
  requirements: []
125
- rubygems_version: 3.6.2
126
+ rubygems_version: 4.0.3
126
127
  specification_version: 4
127
128
  summary: A fast XML parser and object serializer.
128
129
  test_files: []