passenger 5.0.17 → 5.0.18
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/CHANGELOG +7 -0
- data/ext/common/Constants.h +1 -1
- data/ext/common/MemoryKit/palloc.cpp +3 -0
- data/ext/common/MemoryKit/palloc.h +2 -2
- data/ext/common/agent/Core/RequestHandler/ForwardResponse.cpp +23 -2
- data/ext/common/agent/Core/RequestHandler/SendRequest.cpp +16 -3
- data/lib/phusion_passenger.rb +1 -1
- metadata +2 -2
- metadata.gz.asc +7 -7
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MjljNjEwOTUwNWI3MzI5MmZhMzY5MjczYmRmNjUyNTVlYjViMTQxOA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YzRhZGRkYjRmZWM5ZDM0ZmUyYzVmNDUxNmVmMzJmZmU3MTQxZmUxOQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZWRlMDc2MjYxMDY3ZjFhYjdlNmZjODY2N2U5MDViNTQ3OGE3YjUyZjFkZTli
|
10
|
+
ODI4NTE5MjVmZTE4ZWQ1ZWIxZmFiMjFmOWYwMDU1NWU2NzMxYzkxNWYzMGJj
|
11
|
+
ODM0NjczMjNiMzg0ZDc5NjVlZjczN2RiNzc3ODlkYmI4NTM4MTk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NDJkNDc1MDRmMGM3NDJjNTUzN2NmMTYzOTAxZGRkMWY5ZWFmYjJmYTYxNmMx
|
14
|
+
OTU3YWE4ZjgxOGFjNjZmMGU2MTNlNjYwNTNjZGIwY2FjODc0M2VkYzY1ZjFh
|
15
|
+
YWEwYTBiMGViMTZkNWMyNmY1MmIyY2MwMDFiNzM5MzBhNGQ4NGM=
|
checksums.yaml.gz.asc
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
|
3
3
|
Comment: GPGTools - http://gpgtools.org
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
=
|
5
|
+
iQEcBAABAgAGBQJV8AsAAAoJECrHRaUKISqMT+QH/3p3202VncV1kRmFvpNQm7wk
|
6
|
+
bZOLmhlArG0yAXxALXA3kQxRNrRx4KayZjOeYyLCW0B1u6TunuKwhYDMNayMh1ZA
|
7
|
+
OhTfi3vd7yuZIswFc5o8Ll6Pe2dbeO6DOnB6N2B1oxfZP9PTSi4L1iOTsLrsmjHL
|
8
|
+
tOW5DxKlTBuC6+6s7QPCXmUyhCjpjpJxHfGNLsQknqkZzLMCAlsfYQHA9eK5+VRl
|
9
|
+
BgSwWjNVe//sEdFIwJ2TTPSnuls5L9bBFH9S+T0OSsvFBleWPAtFBDcZ1hABV9ho
|
10
|
+
lnUD1su7Oa1oVfu7cN9jdVrP+4QtLeNs+bC40biELIygVPS9rR4/u3MjoX1V7r0=
|
11
|
+
=tMMx
|
12
12
|
-----END PGP SIGNATURE-----
|
data.tar.gz.asc
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
|
3
3
|
Comment: GPGTools - http://gpgtools.org
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
=
|
5
|
+
iQEcBAABAgAGBQJV8Ar/AAoJECrHRaUKISqMFzgH/0ttxtkYKe5ixj9SSR+4wYel
|
6
|
+
kz53Np2qA4U9HPYpLR8bT8ldt91e8xMJQ1xC/ZaWTQyXmGMrqdwO594N2sHc7Jsz
|
7
|
+
cLvFRsVD+8tT1LYS4lomMQYUrBKGk0+/CtyPSZVTS9lLABAi5wJtWVYbA5B9z+gN
|
8
|
+
TllnzGAPEvlA6UTiXpAbEetRsX5SJQAQyaBTYmKDGKSq1/nVLaq9xeSuGNzQJFso
|
9
|
+
NqPqaU8MtrwuTvxBDCr3e61GEG0imU9GLyJu1HPQYwnF75oOySf4iLuSSve5EA1m
|
10
|
+
aHcSEKwKf0mMlxYYdZ0RXMRsC5v4oWT9R7CC7mqFlJ6W9jSXZBJ+uof17Po15Do=
|
11
|
+
=6U+j
|
12
12
|
-----END PGP SIGNATURE-----
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
Release 5.0.18
|
2
|
+
--------------
|
3
|
+
|
4
|
+
* Fixes more memory corruption issues in the palloc subsystem.
|
5
|
+
* Fixes memory corruption issues in the Passenger core that may occur if the application sets many response headers. The issue was caused by an off-by-one bug.
|
6
|
+
|
7
|
+
|
1
8
|
Release 5.0.17
|
2
9
|
--------------
|
3
10
|
|
data/ext/common/Constants.h
CHANGED
@@ -132,7 +132,9 @@ psg_reset_pool(psg_pool_t *pool, size_t size)
|
|
132
132
|
psg_init_pool(pool, size);
|
133
133
|
return true;
|
134
134
|
} else {
|
135
|
+
pool->current = pool;
|
135
136
|
pool->large = NULL;
|
137
|
+
|
136
138
|
for (p = pool; p; p = p->data.next) {
|
137
139
|
char *m = (char *) p;
|
138
140
|
if (p == pool) {
|
@@ -145,6 +147,7 @@ psg_reset_pool(psg_pool_t *pool, size_t size)
|
|
145
147
|
|
146
148
|
p->data.failed = 0;
|
147
149
|
}
|
150
|
+
|
148
151
|
return false;
|
149
152
|
}
|
150
153
|
}
|
@@ -78,7 +78,7 @@ typedef struct psg_pool_large_s {
|
|
78
78
|
|
79
79
|
typedef struct {
|
80
80
|
char *last; /** Last allocated byte inside this block. */
|
81
|
-
char *end; /** End of block memory. */
|
81
|
+
char *end; /** End of block memory. Read-only */
|
82
82
|
psg_pool_t *next;
|
83
83
|
unsigned int failed;
|
84
84
|
} psg_pool_data_t;
|
@@ -91,7 +91,7 @@ struct psg_pool_s {
|
|
91
91
|
* not for any subsequent psg_pool_s objects linked through
|
92
92
|
* `data.next`.
|
93
93
|
*/
|
94
|
-
size_t max;
|
94
|
+
size_t max; /* Read-only */
|
95
95
|
psg_pool_t *current;
|
96
96
|
psg_pool_large_t *large;
|
97
97
|
};
|
@@ -449,15 +449,19 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
449
449
|
unsigned int & restrict_ref dataSize,
|
450
450
|
unsigned int & restrict_ref nCacheableBuffers)
|
451
451
|
{
|
452
|
-
#define
|
452
|
+
#define BEGIN_PUSH_NEXT_BUFFER() \
|
453
453
|
do { \
|
454
|
-
if (buffers != NULL && i
|
454
|
+
if (buffers != NULL && i >= maxbuffers) { \
|
455
455
|
return false; \
|
456
456
|
} \
|
457
|
+
} while (false)
|
458
|
+
#define INC_BUFFER_ITER(i) \
|
459
|
+
do { \
|
457
460
|
i++; \
|
458
461
|
} while (false)
|
459
462
|
#define PUSH_STATIC_BUFFER(str) \
|
460
463
|
do { \
|
464
|
+
BEGIN_PUSH_NEXT_BUFFER(); \
|
461
465
|
if (buffers != NULL) { \
|
462
466
|
buffers[i].iov_base = (void *) str; \
|
463
467
|
buffers[i].iov_len = sizeof(str) - 1; \
|
@@ -478,6 +482,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
478
482
|
PUSH_STATIC_BUFFER("HTTP/");
|
479
483
|
|
480
484
|
if (buffers != NULL) {
|
485
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
481
486
|
const unsigned int BUFSIZE = 16;
|
482
487
|
char *buf = (char *) psg_pnalloc(req->pool, BUFSIZE);
|
483
488
|
const char *end = buf + BUFSIZE;
|
@@ -504,7 +509,9 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
504
509
|
statusAndReason = getStatusCodeAndReasonPhrase(resp->statusCode);
|
505
510
|
if (statusAndReason != NULL) {
|
506
511
|
size_t len = strlen(statusAndReason);
|
512
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
507
513
|
if (buffers != NULL) {
|
514
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
508
515
|
buffers[i].iov_base = (void *) statusAndReason;
|
509
516
|
buffers[i].iov_len = len;
|
510
517
|
}
|
@@ -513,6 +520,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
513
520
|
|
514
521
|
PUSH_STATIC_BUFFER("\r\nStatus: ");
|
515
522
|
if (buffers != NULL) {
|
523
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
516
524
|
buffers[i].iov_base = (void *) statusAndReason;
|
517
525
|
buffers[i].iov_len = len;
|
518
526
|
}
|
@@ -522,6 +530,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
522
530
|
PUSH_STATIC_BUFFER("\r\n");
|
523
531
|
} else {
|
524
532
|
if (buffers != NULL) {
|
533
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
525
534
|
const unsigned int BUFSIZE = 8;
|
526
535
|
char *buf = (char *) psg_pnalloc(req->pool, BUFSIZE);
|
527
536
|
const char *end = buf + BUFSIZE;
|
@@ -533,6 +542,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
533
542
|
dataSize += size;
|
534
543
|
|
535
544
|
PUSH_STATIC_BUFFER(" Unknown Reason-Phrase\r\nStatus: ");
|
545
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
536
546
|
buffers[i].iov_base = (void *) buf;
|
537
547
|
buffers[i].iov_len = size;
|
538
548
|
INC_BUFFER_ITER(i);
|
@@ -563,6 +573,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
563
573
|
part = it->header->origKey.start;
|
564
574
|
while (part != NULL) {
|
565
575
|
if (buffers != NULL) {
|
576
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
566
577
|
buffers[i].iov_base = (void *) part->data;
|
567
578
|
buffers[i].iov_len = part->size;
|
568
579
|
}
|
@@ -570,6 +581,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
570
581
|
part = part->next;
|
571
582
|
}
|
572
583
|
if (buffers != NULL) {
|
584
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
573
585
|
buffers[i].iov_base = (void *) ": ";
|
574
586
|
buffers[i].iov_len = sizeof(": ") - 1;
|
575
587
|
}
|
@@ -578,6 +590,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
578
590
|
part = it->header->val.start;
|
579
591
|
while (part != NULL) {
|
580
592
|
if (buffers != NULL) {
|
593
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
581
594
|
buffers[i].iov_base = (void *) part->data;
|
582
595
|
buffers[i].iov_len = part->size;
|
583
596
|
}
|
@@ -585,6 +598,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
585
598
|
part = part->next;
|
586
599
|
}
|
587
600
|
if (buffers != NULL) {
|
601
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
588
602
|
buffers[i].iov_base = (void *) "\r\n";
|
589
603
|
buffers[i].iov_len = sizeof("\r\n") - 1;
|
590
604
|
}
|
@@ -598,6 +612,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
598
612
|
unsigned int size;
|
599
613
|
|
600
614
|
if (buffers != NULL) {
|
615
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
601
616
|
const unsigned int BUFSIZE = 60;
|
602
617
|
char *dateStr = (char *) psg_pnalloc(req->pool, BUFSIZE);
|
603
618
|
size = constructDateHeaderBuffersForResponse(dateStr, BUFSIZE);
|
@@ -622,6 +637,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
622
637
|
PUSH_STATIC_BUFFER("\r\nSet-Cookie: ");
|
623
638
|
} else {
|
624
639
|
if (buffers != NULL) {
|
640
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
625
641
|
buffers[i].iov_base = (void *) part->data;
|
626
642
|
buffers[i].iov_len = part->size;
|
627
643
|
}
|
@@ -638,6 +654,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
638
654
|
if (resp->bodyType == AppResponse::RBT_CONTENT_LENGTH) {
|
639
655
|
PUSH_STATIC_BUFFER("Content-Length: ");
|
640
656
|
if (buffers != NULL) {
|
657
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
641
658
|
const unsigned int BUFSIZE = 16;
|
642
659
|
char *buf = (char *) psg_pnalloc(req->pool, BUFSIZE);
|
643
660
|
unsigned int size = integerToOtherBase<boost::uint64_t, 10>(
|
@@ -690,6 +707,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
690
707
|
part = cookieName->start;
|
691
708
|
while (part != NULL) {
|
692
709
|
if (buffers != NULL) {
|
710
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
693
711
|
buffers[i].iov_base = (void *) part->data;
|
694
712
|
buffers[i].iov_len = part->size;
|
695
713
|
}
|
@@ -706,6 +724,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
706
724
|
PUSH_STATIC_BUFFER("=");
|
707
725
|
|
708
726
|
if (buffers != NULL) {
|
727
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
709
728
|
buffers[i].iov_base = stickySessionIdStr;
|
710
729
|
buffers[i].iov_len = stickySessionIdSize;
|
711
730
|
}
|
@@ -715,6 +734,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
715
734
|
PUSH_STATIC_BUFFER("; Path=");
|
716
735
|
|
717
736
|
if (buffers != NULL) {
|
737
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
718
738
|
buffers[i].iov_base = (void *) baseURI.data();
|
719
739
|
buffers[i].iov_len = baseURI.size();
|
720
740
|
}
|
@@ -741,6 +761,7 @@ constructHeaderBuffersForResponse(Request *req, struct iovec *buffers,
|
|
741
761
|
nbuffers = i;
|
742
762
|
return true;
|
743
763
|
|
764
|
+
#undef BEGIN_PUSH_NEXT_BUFFER
|
744
765
|
#undef INC_BUFFER_ITER
|
745
766
|
#undef PUSH_STATIC_BUFFER
|
746
767
|
}
|
@@ -594,15 +594,19 @@ constructHeaderBuffersForHttpProtocol(Request *req, struct iovec *buffers,
|
|
594
594
|
unsigned int maxbuffers, unsigned int & restrict_ref nbuffers,
|
595
595
|
unsigned int & restrict_ref dataSize, HttpHeaderConstructionCache &cache)
|
596
596
|
{
|
597
|
-
#define
|
597
|
+
#define BEGIN_PUSH_NEXT_BUFFER() \
|
598
598
|
do { \
|
599
|
-
if (buffers != NULL && i
|
599
|
+
if (buffers != NULL && i >= maxbuffers) { \
|
600
600
|
return false; \
|
601
601
|
} \
|
602
|
+
} while (false)
|
603
|
+
#define INC_BUFFER_ITER(i) \
|
604
|
+
do { \
|
602
605
|
i++; \
|
603
606
|
} while (false)
|
604
607
|
#define PUSH_STATIC_BUFFER(buf) \
|
605
608
|
do { \
|
609
|
+
BEGIN_PUSH_NEXT_BUFFER(); \
|
606
610
|
if (buffers != NULL) { \
|
607
611
|
buffers[i].iov_base = (void *) buf; \
|
608
612
|
buffers[i].iov_len = sizeof(buf) - 1; \
|
@@ -626,6 +630,7 @@ constructHeaderBuffersForHttpProtocol(Request *req, struct iovec *buffers,
|
|
626
630
|
}
|
627
631
|
|
628
632
|
if (buffers != NULL) {
|
633
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
629
634
|
buffers[i].iov_base = (void *) cache.methodStr.data();
|
630
635
|
buffers[i].iov_len = cache.methodStr.size();
|
631
636
|
}
|
@@ -635,6 +640,7 @@ constructHeaderBuffersForHttpProtocol(Request *req, struct iovec *buffers,
|
|
635
640
|
PUSH_STATIC_BUFFER(" ");
|
636
641
|
|
637
642
|
if (buffers != NULL) {
|
643
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
638
644
|
buffers[i].iov_base = (void *) req->path.start->data;
|
639
645
|
buffers[i].iov_len = req->path.size;
|
640
646
|
}
|
@@ -658,6 +664,7 @@ constructHeaderBuffersForHttpProtocol(Request *req, struct iovec *buffers,
|
|
658
664
|
PUSH_STATIC_BUFFER("\r\nSet-Cookie: ");
|
659
665
|
} else {
|
660
666
|
if (buffers != NULL) {
|
667
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
661
668
|
buffers[i].iov_base = (void *) part->data;
|
662
669
|
buffers[i].iov_len = part->size;
|
663
670
|
}
|
@@ -682,6 +689,7 @@ constructHeaderBuffersForHttpProtocol(Request *req, struct iovec *buffers,
|
|
682
689
|
part = it->header->key.start;
|
683
690
|
while (part != NULL) {
|
684
691
|
if (buffers != NULL) {
|
692
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
685
693
|
buffers[i].iov_base = (void *) part->data;
|
686
694
|
buffers[i].iov_len = part->size;
|
687
695
|
}
|
@@ -695,6 +703,7 @@ constructHeaderBuffersForHttpProtocol(Request *req, struct iovec *buffers,
|
|
695
703
|
part = it->header->val.start;
|
696
704
|
while (part != NULL) {
|
697
705
|
if (buffers != NULL) {
|
706
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
698
707
|
buffers[i].iov_base = (void *) part->data;
|
699
708
|
buffers[i].iov_len = part->size;
|
700
709
|
}
|
@@ -718,6 +727,7 @@ constructHeaderBuffersForHttpProtocol(Request *req, struct iovec *buffers,
|
|
718
727
|
part = cache.remoteAddr->start;
|
719
728
|
while (part != NULL) {
|
720
729
|
if (buffers != NULL) {
|
730
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
721
731
|
buffers[i].iov_base = (void *) part->data;
|
722
732
|
buffers[i].iov_len = part->size;
|
723
733
|
}
|
@@ -733,6 +743,7 @@ constructHeaderBuffersForHttpProtocol(Request *req, struct iovec *buffers,
|
|
733
743
|
PUSH_STATIC_BUFFER("Passenger-Txn-Id: ");
|
734
744
|
|
735
745
|
if (buffers != NULL) {
|
746
|
+
BEGIN_PUSH_NEXT_BUFFER();
|
736
747
|
buffers[i].iov_base = (void *) req->options.transaction->getTxnId().data();
|
737
748
|
buffers[i].iov_len = req->options.transaction->getTxnId().size();
|
738
749
|
}
|
@@ -747,6 +758,7 @@ constructHeaderBuffersForHttpProtocol(Request *req, struct iovec *buffers,
|
|
747
758
|
nbuffers = i;
|
748
759
|
return true;
|
749
760
|
|
761
|
+
#undef BEGIN_PUSH_NEXT_BUFFER
|
750
762
|
#undef INC_BUFFER_ITER
|
751
763
|
#undef PUSH_STATIC_BUFFER
|
752
764
|
}
|
@@ -784,7 +796,8 @@ sendHeaderToAppWithHttpProtocolWithBuffering(Request *req, unsigned int offset,
|
|
784
796
|
unsigned int nbuffers, dataSize;
|
785
797
|
bool ok;
|
786
798
|
|
787
|
-
ok = constructHeaderBuffersForHttpProtocol(req, NULL, 0, nbuffers,
|
799
|
+
ok = constructHeaderBuffersForHttpProtocol(req, NULL, 0, nbuffers,
|
800
|
+
dataSize, cache);
|
788
801
|
assert(ok);
|
789
802
|
|
790
803
|
buffers = (struct iovec *) psg_palloc(req->pool,
|
data/lib/phusion_passenger.rb
CHANGED
@@ -30,7 +30,7 @@ module PhusionPassenger
|
|
30
30
|
|
31
31
|
PACKAGE_NAME = 'passenger'
|
32
32
|
# Run 'rake ext/common/Constants.h' after changing this number.
|
33
|
-
VERSION_STRING = '5.0.
|
33
|
+
VERSION_STRING = '5.0.18'
|
34
34
|
|
35
35
|
PREFERRED_NGINX_VERSION = '1.8.0'
|
36
36
|
NGINX_SHA256_CHECKSUM = '23cca1239990c818d8f6da118320c4979aadf5386deda691b1b7c2c96b9df3d5'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: passenger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.
|
4
|
+
version: 5.0.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Phusion - http://www.phusion.nl/
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
metadata.gz.asc
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
|
3
3
|
Comment: GPGTools - http://gpgtools.org
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
+
|
11
|
-
=
|
5
|
+
iQEcBAABAgAGBQJV8Ar/AAoJECrHRaUKISqMhaIH+QHoT+Y0NMeWH32IxRbq4lN1
|
6
|
+
cOXcDv32FyLZoKYYgsze2Z/ptOQOjhaYLM64Q3yFs+24CIWDrwA8W16TnxZLqiuY
|
7
|
+
5DFmZISF4aHYNpcc0meXymCLIgMDm9c3XpPoXKg5nWEnoOyvFyFfUZKs0XBN9s5R
|
8
|
+
d61QEV3tVzCKS4REfiKfb5hyMHApS7P47c6YUExqeRErKTHFJtCt7t5XBEbSVf+f
|
9
|
+
FoomTf8NPRIpaXNx48RMacd2Qb45KsSv+WSc4DnsmKdeAgx83ccQIgEs5Igcrs85
|
10
|
+
SfbBvfHpeKlTWrnRGqi+MG7xR2KQQQs1BFTS+lpCF2kFu6phP6wbJX8l7iAYicw=
|
11
|
+
=0M6B
|
12
12
|
-----END PGP SIGNATURE-----
|