libxml-ruby 3.2.0 → 3.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e28e87b2fe506944adbde7b4562e216ef39a858dfd3c75257bbbbf8b4ea22a8
4
- data.tar.gz: 8fc1f4d3684c17f6fcc83697c6ec2846742ce102ee8c56876dec6a9704d4fee0
3
+ metadata.gz: 5173bcced46009decd7e7a710aaf20b4005cf8baa5e8ee55148cb28733fd3c97
4
+ data.tar.gz: 3649de749c1064ec31c3d563a1328abfb43e401372beb6af4b0b5ad891af1ae3
5
5
  SHA512:
6
- metadata.gz: '035593030f9bbaa922f967e25869d36203efe96fa3cbc63e18d02abf6a615352574d1c82bfd1c6ad7792daa5fe95873902821e45442ed513ae567fc22fc1ac95'
7
- data.tar.gz: 62ef0548e25879fe1b1414a5e9b82ff97f8fe5f7cb9308bf5957c33cf2e8ac9c73a529f78112d9166a842bfbd684c10d4835c4321ff6e740e65b3ed9a9ba7698
6
+ metadata.gz: 3f5e71808404d9553073ae483c15a55b4d72e7a0e5b40939c7f2c72c8867386e7c7489769f6da2ce7da13cbbbd3329f0851d949f6dc48d7c5b40d9ec5784b630
7
+ data.tar.gz: 731d9152dca3cf219af862eb67171b9e5cce8df6c8bde4262eae3c53f1a5528e211188a50b472be67e3a294cf4b4f0d2a239317b5c08a3b2886b5e9c5fece14a
data/HISTORY CHANGED
@@ -1,10 +1,32 @@
1
1
  = Release History
2
2
 
3
+ == 3.2.3 / 2022-05-22
4
+
5
+ * Change some getter methods to instance variables with attr_accessors for easier debuggability (David Hansen)
6
+ * Add a number of tests related to schemas (David Hansen)
7
+ * Add schema.imported_elements so we can find imported elements (David Hansen)
8
+ * Fix segfault under windows when dereferencing a pre-existing error where the node has already been freed (David Hansen)
9
+ * Update to change name from imported_elements to imported_ns_elements and return a hash of hashes for namespaced elements (David Hansen)
10
+ * Only call xmlGetFeaturesList if LIBXML_LEGACY_ENABLED is defined. Most distros still ship libxml2 with legacy features enabled, but this will change (Nick Wellnhofer)
11
+ * Update GitHub Actions to use ruby/setup-ruby (Greg)
12
+ * Fix memory leak in rxml_node_path, node.path (vovanmozg)
13
+
14
+ == 3.2.2 / 2022-01-15
15
+ * Switch to Github actions for CI/CD (Greg)
16
+ * Test fixes (Greg, Sergio Durigan Junior)
17
+ * Fix typo on test/test_sax_parser.rb (Sergio Durigan Junior)
18
+ * Update homepage in gemspec (Pirate Praveen Arimbrathodiyil)
19
+
20
+ == 3.2.1 / 2020-11-05
21
+
22
+ * Fix incorrect handling of encodings when using XMLWriter.io (Charlie Savage)
23
+ * Clean up README (Richard Michael)
24
+
3
25
  == 3.2.0 / 2020-05-09 Charlie Savage
4
26
 
5
27
  * Fix crash when creating an empty DTD
6
28
  * Modernize tests to use Bundler to load gem
7
- * Add libxml-ruby.rb file so gem loads in expted way.
29
+ * Add libxml-ruby.rb file so gem loads in expected way.
8
30
  * Add support for xmlSaveNoEmptyTags.
9
31
  * Clean up extconf.rb file
10
32
 
data/README.rdoc CHANGED
@@ -12,7 +12,7 @@ We think libxml-ruby is the best XML library for Ruby because:
12
12
 
13
13
  == Requirements
14
14
  libxml-ruby requires Ruby 1.8.7 or higher. It depends on libxml2 to
15
- function propoerly. libxml2, in turn, depends on:
15
+ function properly. libxml2, in turn, depends on:
16
16
 
17
17
  * libm (math routines: very standard)
18
18
  * libz (zlib)
@@ -21,25 +21,41 @@ function propoerly. libxml2, in turn, depends on:
21
21
  If you are running Linux or Unix you'll need a C compiler so the
22
22
  extension can be compiled when it is installed. If you are running
23
23
  Windows, then install the x64-mingw32 gem or build it yourself using
24
- Devkit (http://rubyinstaller.org/add-ons/devkit/) or
25
- msys2 (https://msys2.github.io/).
24
+ Devkit[http://rubyinstaller.org/add-ons/devkit/] or
25
+ msys2[https://msys2.github.io/].
26
26
 
27
- == INSTALLATION
28
- The easiest way to install libxml-ruby is via Ruby Gems. To install:
27
+ == Installation
28
+ The easiest way to install libxml-ruby is via RubyGems. To install:
29
29
 
30
30
  <tt>gem install libxml-ruby</tt>
31
31
 
32
+ If the extension compile process cannot find libxml2, you may need to indicate
33
+ the location of the libxml2 configuration utility as it is used to find the
34
+ required header and include files. (If you need to indicate a location for the
35
+ libxml2 library or header files different than reported by <tt>xml2-config</tt>,
36
+ see the additional configuration options.)
37
+
38
+ This may be done with RubyGems:
39
+
40
+ <tt>gem install libxml-ruby -- --with-xml2-dir=/path/to/xml2-config</tt>
41
+
42
+ Or bundler:
43
+
44
+ <tt>bundle config build.libxml-ruby --with-xml2-config=/path/to/xml2-config</tt>
45
+
46
+ <tt>bundle install libxml-ruby</tt>
47
+
32
48
  If you are running Windows, then install the libxml-ruby-x64-mingw32 gem.
33
- THe gem inncludes prebuilt extensions for Ruby 2.3. These
49
+ The gem includes prebuilt extensions for Ruby 2.3. These
34
50
  extensions are built using MinGW64 and libxml2 version 2.9.3,
35
51
  iconv version 1.14 and zlib version 1.2.8. Note these binaries
36
- are available in the lib\libs directory. To use them, put them
37
- someplace on your path.
52
+ are available in the <tt>lib\\libs</tt> directory. To use them, put them
53
+ on your <tt>PATH</tt>.
38
54
 
39
55
  The gem also includes a Microsoft VC++ 2012 solution and XCode 5 project - these
40
56
  are very useful for debugging.
41
57
 
42
- libxml-ruby's source codes lives on Github at https://github.com/xml4r/libxml-ruby.
58
+ libxml-ruby's source codes lives on GitHub[https://github.com/xml4r/libxml-ruby].
43
59
 
44
60
  == Getting Started
45
61
  Using libxml is easy. First decide what parser you want to use:
@@ -60,7 +76,7 @@ Beyond the basics of parsing and processing XML and HTML documents,
60
76
  libxml provides a wealth of additional functionality.
61
77
 
62
78
  Most commonly, you'll want to use its LibXML::XML::XPath support, which makes
63
- it easy to find data inside a XML document. Although not as popular,
79
+ it easy to find data inside an XML document. Although not as popular,
64
80
  LibXML::XML::XPointer provides another API for finding data inside an XML document.
65
81
 
66
82
  Often times you'll need to validate data before processing it. For example,
@@ -72,17 +88,16 @@ This can be done using libxml's powerful set of validators:
72
88
  * Relax Schemas (LibXML::XML::RelaxNG)
73
89
  * XML Schema (LibXML::XML::Schema)
74
90
 
75
- Finally, if you'd like to use XSL Transformations to process data,
76
- then install the libxslt gem which is available at
77
- https://github.com/xml4r/libxslt-ruby.
91
+ Finally, if you'd like to use XSL Transformations to process data, then install
92
+ the {libxslt gem}[https://github.com/xml4r/libxslt-rubygem].
78
93
 
79
94
  == Usage
80
- For information about using libxml-ruby please refer to its documentation at
81
- http://xml4r.github.com/libxml-ruby/rdoc/index.html. Some tutorials are also
82
- available at https://github.com/xml4r/libxml-ruby/wiki.
95
+ For information about using libxml-ruby please refer to its
96
+ documentation[http://xml4r.github.io/libxml-ruby]. Some tutorials are also
97
+ available[https://github.com/xml4r/libxml-ruby/wiki].
83
98
 
84
99
  All libxml classes are in the LibXML::XML module. The easiest
85
- way to use libxml is to require 'xml'. This will mixin
100
+ way to use libxml is to <tt>require 'xml'</tt>. This will mixin
86
101
  the LibXML module into the global namespace, allowing you to
87
102
  write code like this:
88
103
 
@@ -131,10 +146,11 @@ Once you have build the shared libary, you can then run tests using rake:
131
146
  +Travis build status: {<img src="https://travis-ci.org/xml4r/libxml-ruby.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/xml4r/libxml-ruby]
132
147
 
133
148
  == Performance
149
+
134
150
  In addition to being feature rich and conformation, the main reason
135
- people use libxml-ruby is for performance. Here are the results
151
+ people use libxml-ruby is for performance. Here are the results
136
152
  of a couple simple benchmarks recently blogged about on the
137
- Web (you can find them in the benchmark directory of the
153
+ Web (you can find them in the benchmark directory of the
138
154
  libxml distribution).
139
155
 
140
156
  From http://depixelate.com/2008/4/23/ruby-xml-parsing-benchmarks
@@ -156,46 +172,46 @@ From https://svn.concord.org/svn/projects/trunk/common/ruby/xml_benchmarks/
156
172
  Documentation is available via rdoc, and is installed automatically with the
157
173
  gem.
158
174
 
159
- libxml-ruby's online documentation is generated using Hanna, which is a
160
- development gem dependency.
175
+ libxml-ruby's {online
176
+ documentation}[https://xml4r.github.io/libxml-ruby/rdoc/index.html] is generated
177
+ using Hanna, which is a development gem dependency.
161
178
 
162
179
  Note that older versions of Rdoc, which ship with Ruby 1.8.x, will report
163
180
  a number of errors. To avoid them, install Rdoc 2.1 or higher. Once you have
164
181
  installed the gem, you'll have to disable the version of Rdoc that Ruby 1.8.x
165
- includes. An easy way to do that is rename the directory ruby/lib/ruby/1.8/rdoc to
166
- ruby/lib/ruby/1.8/rdoc_old.
182
+ includes. An easy way to do that is rename the directory
183
+ <tt>ruby/lib/ruby/1.8/rdoc</tt> to
184
+ <tt>ruby/lib/ruby/1.8/rdoc_old</tt>.
167
185
 
168
186
  == Support
169
-
170
- If you have any questions about using libxml-ruby, please report them to
171
- Git Hub at https://github.com/xml4r/libxml-ruby/issues
187
+ If you have any questions about using libxml-ruby, please report an issue
188
+ on GitHub[https://github.com/xml4r/libxml-ruby/issues].
172
189
 
173
190
  == Memory Management
174
191
  libxml-ruby automatically manages memory associated with the
175
192
  underlying libxml2 library. The bindings create a one-to-one mapping between
176
- ruby objects and libxml documents and libxml parent nodes (ie, nodes that do not
177
- have a parent and do not belong to a document). In these cases,
193
+ Ruby objects and libxml documents and libxml parent nodes (ie, nodes that do not
194
+ have a parent and do not belong to a document). In these cases,
178
195
  the bindings manage the memory. They do this by installing a free
179
196
  function and storing a back pointer to the Ruby object from the xmlnode
180
197
  using the _private member on libxml structures. When the Ruby object
181
198
  goes out of scope, the underlying libxml structure is freed. Libxml
182
- itself then frees all child node (recursively).
199
+ itself then frees all child nodes (recursively).
183
200
 
184
201
  For all other nodes (the vast majority), the bindings create temporary
185
202
  Ruby objects that get freed once they go out of scope. Thus there can be
186
- more than one ruby object pointing to the same xml node. To mostly hide
187
- this from programmers on the ruby side, the #eql? and #== methods are
188
- overriden to check if two ruby objects wrap the same xmlnode. If they do,
203
+ more than one Ruby object pointing to the same xml node. To mostly hide
204
+ this from a programmer on the Ruby side, the <tt>#eql?</tt> and <tt>#==</tt> methods are
205
+ overriden to check if two Ruby objects wrap the same xmlnode. If they do,
189
206
  then the methods return true. During the mark phase, each of these temporary
190
207
  objects marks its owning document, thereby keeping the Ruby document object
191
208
  alive and thus the xmldoc tree.
192
209
 
193
210
  In the sweep phase of the garbage collector, or when a program ends,
194
- there is no order to how Ruby objects are freed. In fact, the ruby document
195
- object is almost always freed before any ruby objects that wrap child nodes.
196
- However, this is ok because those ruby objects do not have a free function
211
+ there is no order to how Ruby objects are freed. In fact, the Ruby document
212
+ object is almost always freed before any Ruby objects that wrap child nodes.
213
+ However, this is ok because those Ruby objects do not have a free function
197
214
  and are no longer in scope (since if they were the document would not be freed).
198
215
 
199
216
  == License
200
217
  See LICENSE for license information.
201
-
data/Rakefile CHANGED
@@ -16,21 +16,29 @@ spec = Gem::Specification.load("#{GEM_NAME}.gemspec")
16
16
  task :default => [:test]
17
17
 
18
18
  # Setup compile tasks
19
- if RUBY_PLATFORM.match(/mswin32|mswin64|mingw32/)
20
- Rake::ExtensionTask.new do |ext|
21
- ext.gem_spec = spec
22
- ext.name = SO_NAME
23
- ext.ext_dir = "ext/libxml"
24
- ext.lib_dir = "lib/#{RUBY_VERSION.sub(/\.\d$/, '')}"
25
- ext.config_options << "--with-xml2-include=C:/msys64/mingw64/include/libxml2"
26
- end
27
- else
28
- Rake::ExtensionTask.new do |ext|
29
- ext.gem_spec = spec
30
- ext.name = SO_NAME
31
- ext.ext_dir = "ext/libxml"
32
- ext.lib_dir = "lib/#{RUBY_VERSION.sub(/\.\d$/, '')}"
33
- ext.config_options << "--with-xml2-include=/usr/include/libxml2"
19
+ Rake::ExtensionTask.new do |ext|
20
+ ext.gem_spec = spec
21
+ ext.name = SO_NAME
22
+ ext.ext_dir = "ext/libxml"
23
+ ext.lib_dir = "lib/#{RUBY_VERSION.sub(/\.\d$/, '')}"
24
+ if RUBY_PLATFORM.match(/mswin|mingw/)
25
+ ext.config_options <<
26
+ if (dir = ENV['WINDOWS_XML2_INCLUDE'])
27
+ "--with-xml2-include=#{dir}"
28
+ else
29
+ case RUBY_PLATFORM
30
+ when 'i386-mingw32'
31
+ '--with-xml2-include=C:/msys64/mingw32/include/libxml2'
32
+ when 'x64-mingw32'
33
+ '--with-xml2-include=C:/msys64/mingw64/include/libxml2'
34
+ when 'x64-mingw-ucrt'
35
+ '--with-xml2-include=C:/msys64/ucrt64/include/libxml2'
36
+ else
37
+ raise "Unknown Windows Ruby, please set ENV['WINDOWS_XML2_INCLUDE']"
38
+ end
39
+ end
40
+ else
41
+ ext.config_options << '--with-xml2-include=/usr/include/libxml2'
34
42
  end
35
43
  end
36
44
 
@@ -41,7 +49,7 @@ Gem::PackageTask.new(spec) do |pkg|
41
49
  end
42
50
 
43
51
  # Setup Windows Gem
44
- if RUBY_PLATFORM.match(/mswin32|mswin64|mingw32/)
52
+ if RUBY_PLATFORM.match(/mswin|mingw/)
45
53
  binaries = (FileList['lib/**/*.so',
46
54
  'lib/**/*dll'])
47
55
 
@@ -764,6 +764,9 @@ static VALUE rxml_default_save_no_empty_tags_set(VALUE klass, VALUE value)
764
764
  */
765
765
  static VALUE rxml_features(VALUE klass)
766
766
  {
767
+ #ifndef LIBXML_LEGACY_ENABLED
768
+ return Qnil;
769
+ #else
767
770
  VALUE arr, str;
768
771
  int i, len = MAX_LIBXML_FEATURES_LEN;
769
772
  char **list = NULL;
@@ -788,6 +791,7 @@ static VALUE rxml_features(VALUE klass)
788
791
 
789
792
  ruby_xfree(list);
790
793
  return (arr);
794
+ #endif /* LIBXML_LEGACY_ENABLED */
791
795
  }
792
796
 
793
797
  /*
@@ -483,7 +483,6 @@ static VALUE rxml_document_encoding_get(VALUE self)
483
483
  * Returns the Ruby encoding specified by this document
484
484
  * (available on Ruby 1.9.x and higher).
485
485
  */
486
- #ifdef HAVE_RUBY_ENCODING_H
487
486
  static VALUE rxml_document_rb_encoding_get(VALUE self)
488
487
  {
489
488
  xmlDocPtr xdoc;
@@ -493,7 +492,6 @@ static VALUE rxml_document_rb_encoding_get(VALUE self)
493
492
  rbencoding = rxml_xml_encoding_to_rb_encoding(mXMLEncoding, xmlParseCharEncoding((const char*)xdoc->encoding));
494
493
  return rb_enc_from_encoding(rbencoding);
495
494
  }
496
- #endif
497
495
 
498
496
  /*
499
497
  * call-seq:
@@ -1097,9 +1095,7 @@ void rxml_init_document(void)
1097
1095
  rb_define_method(cXMLDocument, "compression?", rxml_document_compression_q, 0);
1098
1096
  rb_define_method(cXMLDocument, "debug", rxml_document_debug, 0);
1099
1097
  rb_define_method(cXMLDocument, "encoding", rxml_document_encoding_get, 0);
1100
- #ifdef HAVE_RUBY_ENCODING_H
1101
1098
  rb_define_method(cXMLDocument, "rb_encoding", rxml_document_rb_encoding_get, 0);
1102
- #endif
1103
1099
  rb_define_method(cXMLDocument, "encoding=", rxml_document_encoding_set, 1);
1104
1100
  rb_define_method(cXMLDocument, "import", rxml_document_import, 1);
1105
1101
  rb_define_method(cXMLDocument, "last", rxml_document_last_get, 0);
@@ -74,7 +74,6 @@ static VALUE rxml_encoding_to_s(VALUE klass, VALUE encoding)
74
74
  return rxml_new_cstr(xencoding, xencoding);
75
75
  }
76
76
 
77
- #ifdef HAVE_RUBY_ENCODING_H
78
77
  /*
79
78
  * Converts an xmlCharEncoding enum value into a Ruby Encoding object (available
80
79
  * on Ruby 1.9.* and higher).
@@ -179,26 +178,17 @@ rb_encoding* rxml_figure_encoding(const xmlChar* xencoding)
179
178
  }
180
179
  return result;
181
180
  }
182
- #endif
183
181
 
184
182
  VALUE rxml_new_cstr(const xmlChar* xstr, const xmlChar* xencoding)
185
183
  {
186
- #ifdef HAVE_RUBY_ENCODING_H
187
184
  rb_encoding *rbencoding = rxml_figure_encoding(xencoding);
188
185
  return rb_external_str_new_with_enc((const char*)xstr, strlen((const char*)xstr), rbencoding);
189
- #else
190
- return rb_str_new2((const char*)xstr);
191
- #endif
192
186
  }
193
187
 
194
188
  VALUE rxml_new_cstr_len(const xmlChar* xstr, const long length, const xmlChar* xencoding)
195
189
  {
196
- #ifdef HAVE_RUBY_ENCODING_H
197
190
  rb_encoding *rbencoding = rxml_figure_encoding(xencoding);
198
191
  return rb_external_str_new_with_enc((const char*)xstr, length, rbencoding);
199
- #else
200
- return rb_str_new((const char*)xstr, length);
201
- #endif
202
192
  }
203
193
 
204
194
  void rxml_init_encoding(void)
@@ -207,9 +197,7 @@ void rxml_init_encoding(void)
207
197
  rb_define_module_function(mXMLEncoding, "from_s", rxml_encoding_from_s, 1);
208
198
  rb_define_module_function(mXMLEncoding, "to_s", rxml_encoding_to_s, 1);
209
199
 
210
- #ifdef HAVE_RUBY_ENCODING_H
211
- // rb_define_module_function(mXMLEncoding, "to_rb_encoding", rxml_encoding_to_rb_encoding, 2);
212
- #endif
200
+ rb_define_module_function(mXMLEncoding, "to_rb_encoding", rxml_encoding_to_rb_encoding, 2);
213
201
 
214
202
  /* -1: No char encoding detected. */
215
203
  rb_define_const(mXMLEncoding, "ERROR", INT2NUM(XML_CHAR_ENCODING_ERROR));
@@ -7,13 +7,10 @@ extern VALUE mXMLEncoding;
7
7
 
8
8
  void rxml_init_encoding();
9
9
 
10
- // Ruby 1.8/1.9 encoding compatibility
11
10
  VALUE rxml_new_cstr(const xmlChar* xstr, const xmlChar* xencoding);
12
11
  VALUE rxml_new_cstr_len(const xmlChar* xstr, const long length, const xmlChar* xencoding);
13
12
 
14
- #ifdef HAVE_RUBY_ENCODING_H
15
13
  rb_encoding* rxml_xml_encoding_to_rb_encoding(VALUE klass, xmlCharEncoding xmlEncoding);
16
14
  rb_encoding* rxml_figure_encoding(const xmlChar* xencoding);
17
- #endif
18
15
 
19
16
  #endif
@@ -1,13 +1,10 @@
1
1
  /* Please see the LICENSE file for copyright and distribution information */
2
2
 
3
3
  #include "ruby_libxml.h"
4
+ #include <ruby/io.h>
4
5
 
5
6
  static ID READ_METHOD;
6
- #ifdef HAVE_RB_IO_BUFWRITE
7
- #include <ruby/io.h>
8
- #else
9
7
  static ID WRITE_METHOD;
10
- #endif /* !HAVE_RB_IO_BUFWRITE */
11
8
 
12
9
  /* This method is called by libxml when it wants to read
13
10
  more data from a stream. We go with the duck typing
@@ -27,25 +24,24 @@ int rxml_read_callback(void *context, char *buffer, int len)
27
24
  return (int)size;
28
25
  }
29
26
 
30
- int rxml_write_callback(void *context, const char *buffer, int len)
27
+ int rxml_write_callback(VALUE io, const char *buffer, int len)
31
28
  {
32
- #ifndef HAVE_RB_IO_BUFWRITE
33
- VALUE io, written, string;
34
-
35
- io = (VALUE) context;
36
- string = rb_str_new(buffer, len);
37
- written = rb_funcall(io, WRITE_METHOD, 1, string);
38
-
39
- return NUM2INT(written);
40
- #else
41
- return (int)rb_io_bufwrite((VALUE) context, buffer, (size_t)len);
42
- #endif /* !HAVE_RB_IO_BUFWRITE */
29
+ if (rb_io_check_io(io) == Qnil)
30
+ {
31
+ // Could be StringIO
32
+ VALUE written, string;
33
+ string = rb_external_str_new_with_enc(buffer, strlen(buffer), rb_enc_get(io));
34
+ written = rb_funcall(io, WRITE_METHOD, 1, string);
35
+ return NUM2INT(written);
36
+ }
37
+ else
38
+ {
39
+ return (int)rb_io_bufwrite(io, buffer, (size_t)len);
40
+ }
43
41
  }
44
42
 
45
43
  void rxml_init_io(void)
46
44
  {
47
45
  READ_METHOD = rb_intern("read");
48
- #ifndef HAVE_RB_IO_BUFWRITE
49
46
  WRITE_METHOD = rb_intern("write");
50
- #endif /* !HAVE_RB_IO_BUFWRITE */
51
47
  }
@@ -4,7 +4,7 @@
4
4
  #define __RXML_IO__
5
5
 
6
6
  int rxml_read_callback(void *context, char *buffer, int len);
7
- int rxml_write_callback(void *context, const char *buffer, int len);
7
+ int rxml_write_callback(VALUE io, const char *buffer, int len);
8
8
  void rxml_init_io(void);
9
9
 
10
10
  #endif
@@ -52,6 +52,7 @@ static VALUE rxml_namespace_initialize(VALUE self, VALUE node, VALUE prefix,
52
52
 
53
53
  Check_Type(node, T_DATA);
54
54
  Data_Get_Struct(node, xmlNode, xnode);
55
+ xmlResetLastError();
55
56
 
56
57
  /* Prefix can be null - that means its the default namespace */
57
58
  xmlPrefix = NIL_P(prefix) ? NULL : (xmlChar *)StringValuePtr(prefix);
@@ -983,14 +983,18 @@ static VALUE rxml_node_path(VALUE self)
983
983
  {
984
984
  xmlNodePtr xnode;
985
985
  xmlChar *path;
986
+ VALUE result = Qnil;
986
987
 
987
988
  xnode = rxml_get_xnode(self);
988
989
  path = xmlGetNodePath(xnode);
989
990
 
990
- if (path == NULL)
991
- return (Qnil);
992
- else
993
- return (rxml_new_cstr( path, NULL));
991
+ if (path)
992
+ {
993
+ result = rxml_new_cstr( path, NULL);
994
+ xmlFree(path);
995
+ }
996
+
997
+ return result;
994
998
  }
995
999
 
996
1000
  /*