redcarpet 1.3.2 → 1.3.3

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

Potentially problematic release.


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

@@ -21,9 +21,9 @@
21
21
  *
22
22
  * BUFFER_STATS • if defined, stats are kept about memory usage
23
23
  */
24
- #define BUFFER_STATS
25
24
 
26
25
  #define BUFFER_STDARG
26
+ #define BUFFER_MAX_ALLOC_SIZE (1024 * 1024 * 16) //16mb
27
27
 
28
28
  #include "buffer.h"
29
29
 
@@ -153,7 +153,7 @@ int
153
153
  bufgrow(struct buf *buf, size_t neosz) {
154
154
  size_t neoasz;
155
155
  void *neodata;
156
- if (!buf || !buf->unit) return 0;
156
+ if (!buf || !buf->unit || neosz > BUFFER_MAX_ALLOC_SIZE) return 0;
157
157
  if (buf->asize >= neosz) return 1;
158
158
  neoasz = buf->asize + buf->unit;
159
159
  while (neoasz < neosz) neoasz += buf->unit;
@@ -34,8 +34,6 @@ struct buf {
34
34
  size_t unit; /* reallocation unit size (0 = read-only buffer) */
35
35
  int ref; }; /* reference count */
36
36
 
37
-
38
-
39
37
  /**********
40
38
  * MACROS *
41
39
  **********/
@@ -600,7 +600,7 @@ char_langle_tag(struct buf *ob, struct render *rndr, char *data, size_t offset,
600
600
  struct buf work = { data, end, 0, 0, 0 };
601
601
  int ret = 0;
602
602
 
603
- if (end) {
603
+ if (end > 2) {
604
604
  if (rndr->make.autolink && altype != MKDA_NOT_AUTOLINK) {
605
605
  work.data = data + 1;
606
606
  work.size = end - 2;
@@ -1001,23 +1001,29 @@ parse_blockquote(struct buf *ob, struct render *rndr, char *data, size_t size)
1001
1001
 
1002
1002
  beg = 0;
1003
1003
  while (beg < size) {
1004
- for (end = beg + 1; end < size && data[end - 1] != '\n'; end += 1);
1004
+ for (end = beg + 1; end < size && data[end - 1] != '\n'; end++);
1005
+
1005
1006
  pre = prefix_quote(data + beg, end - beg);
1006
- if (pre) beg += pre; /* skipping prefix */
1007
- else if (is_empty(data + beg, end - beg)
1008
- && (end >= size || (prefix_quote(data + end, size - end) == 0
1009
- && !is_empty(data + end, size - end))))
1010
- /* empty line followed by non-quote line */
1007
+
1008
+ if (pre)
1009
+ beg += pre; /* skipping prefix */
1010
+
1011
+ /* empty line followed by non-quote line */
1012
+ else if (is_empty(data + beg, end - beg) &&
1013
+ (end >= size || (prefix_quote(data + end, size - end) == 0 &&
1014
+ !is_empty(data + end, size - end))))
1011
1015
  break;
1016
+
1012
1017
  if (beg < end) { /* copy into the in-place working buffer */
1013
1018
  /* bufput(work, data + beg, end - beg); */
1014
1019
  if (!work_data)
1015
1020
  work_data = data + beg;
1016
1021
  else if (data + beg != work_data + work_size)
1017
- memmove(work_data + work_size, data + beg,
1018
- end - beg);
1019
- work_size += end - beg; }
1020
- beg = end; }
1022
+ memmove(work_data + work_size, data + beg, end - beg);
1023
+ work_size += end - beg;
1024
+ }
1025
+ beg = end;
1026
+ }
1021
1027
 
1022
1028
  parse_block(out, rndr, work_data, work_size);
1023
1029
  if (rndr->make.blockquote)
@@ -1094,7 +1100,7 @@ parse_paragraph(struct buf *ob, struct render *rndr, char *data, size_t size)
1094
1100
  while (work.size && data[work.size - 1] == '\n')
1095
1101
  work.size -= 1;
1096
1102
 
1097
- if (work.size) {
1103
+ if (work.size > 0) {
1098
1104
  struct buf *tmp = 0;
1099
1105
 
1100
1106
  if (rndr->work.size < rndr->work.asize) {
@@ -1330,18 +1336,32 @@ parse_atxheader(struct buf *ob, struct render *rndr, char *data, size_t size)
1330
1336
  size_t i, end, skip;
1331
1337
  struct buf work = { data, 0, 0, 0, 0 };
1332
1338
 
1333
- if (!size || data[0] != '#') return 0;
1334
- while (level < size && level < 6 && data[level] == '#') level += 1;
1335
- for (i = level; i < size && (data[i] == ' ' || data[i] == '\t');
1336
- i += 1);
1339
+ if (!size || data[0] != '#')
1340
+ return 0;
1341
+
1342
+ while (level < size && level < 6 && data[level] == '#')
1343
+ level++;
1344
+
1345
+ for (i = level; i < size && (data[i] == ' ' || data[i] == '\t'); i++);
1346
+
1337
1347
  work.data = data + i;
1338
- for (end = i; end < size && data[end] != '\n'; end += 1);
1348
+ for (end = i; end < size && data[end] != '\n'; end++);
1339
1349
  skip = end;
1340
- while (end && data[end - 1] == '#') end -= 1;
1341
- while (end && (data[end - 1] == ' ' || data[end - 1] == '\t')) end -= 1;
1342
- work.size = end - i;
1343
- if (rndr->make.header)
1344
- rndr->make.header(ob, &work, (int)level, &rndr->make.render_options);
1350
+
1351
+ while (end && data[end - 1] == '#')
1352
+ end--;
1353
+
1354
+ while (end && (data[end - 1] == ' ' || data[end - 1] == '\t'))
1355
+ end--;
1356
+
1357
+ if (end > i) {
1358
+ work.size = end - i;
1359
+
1360
+ if (rndr->make.header)
1361
+ rndr->make.header(ob, &work, (int)level, &rndr->make.render_options);
1362
+
1363
+ }
1364
+
1345
1365
  return skip;
1346
1366
  }
1347
1367
 
@@ -47,12 +47,6 @@ is_safe_link(const char *link, size_t link_len)
47
47
  return 0;
48
48
  }
49
49
 
50
- static inline int
51
- is_uri_char(char c)
52
- {
53
- return isalnum(c) || strchr("/:$-_.+!*'(),", c) != NULL;
54
- }
55
-
56
50
  static inline int
57
51
  put_scaped_char(struct buf *ob, char c)
58
52
  {
@@ -454,7 +448,7 @@ rndr_normal_text(struct buf *ob, struct buf *text, struct mkd_renderopt *options
454
448
  is_safe_link(text->data + i, text->size - i)) {
455
449
  size_t j = i;
456
450
 
457
- while (j < text->size && is_uri_char(text->data[j]))
451
+ while (j < text->size && !isspace(text->data[j]))
458
452
  j++;
459
453
 
460
454
  rndr_autolink2(ob, &text->data[i], j - i, MKDA_NORMAL);
@@ -26,7 +26,7 @@
26
26
  # end
27
27
  #
28
28
  class Redcarpet
29
- VERSION = '1.3.2'
29
+ VERSION = '1.3.3'
30
30
 
31
31
  # Original Markdown formatted text.
32
32
  attr_reader :text
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'redcarpet'
3
- s.version = '1.3.2'
3
+ s.version = '1.3.3'
4
4
  s.summary = "Ruby bindings for libupskirt"
5
5
  s.date = '2011-04-06'
6
6
  s.email = 'vicent@github.com'
@@ -146,4 +146,12 @@ class RedcarpetTest < Test::Unit::TestCase
146
146
  This could be more elegant.
147
147
  leaks
148
148
  end
149
+
150
+ def test_infinite_loop_in_header
151
+ assert_equal Redcarpet.new(<<-header).to_html.strip, "<h1>Body</h1>"
152
+ ######
153
+ #Body#
154
+ ######
155
+ header
156
+ end
149
157
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redcarpet
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 3
9
- - 2
10
- version: 1.3.2
9
+ - 3
10
+ version: 1.3.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - "Natacha Port\xC3\xA9"