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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YzJjYjMxNmJjNzhhMGY5MDI4YzFkODExOTJkMGYxYmRmMTM5ZjA3OA==
4
+ MjljNjEwOTUwNWI3MzI5MmZhMzY5MjczYmRmNjUyNTVlYjViMTQxOA==
5
5
  data.tar.gz: !binary |-
6
- NzVmNTBhOWE3NjhkYTYwNGZiZmVkMWU5YzhmYjZkYjU2YjM3YzRlOA==
6
+ YzRhZGRkYjRmZWM5ZDM0ZmUyYzVmNDUxNmVmMzJmZmU3MTQxZmUxOQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NjNlNGI1YmI1ZjMzMGVmOTRkMjRlMzY0ZTU1MmFlMTk2MjliZDJjMzVlMTg0
10
- NjI3NmYxZTdlNTkxNGNiOTc5NmRjZmJjYzg4MTdhZjE3YTMxZmJkYWQzNDU3
11
- NThjYzBlYTkxMWI4NWNmNzVhOWIwYjg1OGJlMzM1ZTU0NDYzMDM=
9
+ ZWRlMDc2MjYxMDY3ZjFhYjdlNmZjODY2N2U5MDViNTQ3OGE3YjUyZjFkZTli
10
+ ODI4NTE5MjVmZTE4ZWQ1ZWIxZmFiMjFmOWYwMDU1NWU2NzMxYzkxNWYzMGJj
11
+ ODM0NjczMjNiMzg0ZDc5NjVlZjczN2RiNzc3ODlkYmI4NTM4MTk=
12
12
  data.tar.gz: !binary |-
13
- MDhiNGZiZWI1OGI4ZTkzZGVjNzBkYzgxYzEwYTFmZDA4MzA0YTZiNjk3MTZk
14
- YjhhYWNhMmExNDVkZWQ2Y2NlYTE5MTRhZjIzZmU1MmVkNTY4ZjdkNmYzYjk3
15
- OGMyMzM5Mzg0M2JiMDZiOWE2MGMwZjI2MGVlNTRhNTE3NjcxMWI=
13
+ NDJkNDc1MDRmMGM3NDJjNTUzN2NmMTYzOTAxZGRkMWY5ZWFmYjJmYTYxNmMx
14
+ OTU3YWE4ZjgxOGFjNjZmMGU2MTNlNjYwNTNjZGIwY2FjODc0M2VkYzY1ZjFh
15
+ YWEwYTBiMGViMTZkNWMyNmY1MmIyY2MwMDFiNzM5MzBhNGQ4NGM=
@@ -2,11 +2,11 @@
2
2
  Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
3
3
  Comment: GPGTools - http://gpgtools.org
4
4
 
5
- iQEcBAABAgAGBQJV7ioZAAoJECrHRaUKISqMzGMH/2hOLPNIte03VdFX8eYr6YhE
6
- OPz0UoX3GOnqd+cUdGHS/+Z54LN2r7GYGKu4jdMY/8OjOhTX3iylPlK0VtsPfKoR
7
- ne6IPl2S2msbwwATiveOl0v6fIOf/sg/ZO3uKpnuKN03AKB1ny8KAcw8WIlCFNff
8
- GTwUCY72eBo5GUgnl/CzCn589OTDtMsxckTM3x7OeJ1j8eSNYw1sRCtkeQmcR3Lv
9
- XX+vFGs3PV4+qry1ALwg3MjjX4jCtEMjOa8fvaTEqLLtPTwxYETXY2aVQraPVuM6
10
- I6/aDBOFqtBp/Lz3vpJ3+m3xSSHaNWM1PqxOm3ZiG4LbnJdjTUP+4wCy/g5KCKE=
11
- =FEca
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
- iQEcBAABAgAGBQJV7ioYAAoJECrHRaUKISqMfqUH/jjqWUz7G3w7odcWAPmc1awo
6
- XvOhFpJqTvwV6d1Cyr1gum7W3/LJ5qvfARGuZ6FcH11/rECTeg93wQmx8yHMwmTS
7
- TKEhFQPPpMWt192t2qcHlJ1ybmkNP9e/47A9ca8H/Gq+xCJmHUa9Im3dd5mqcT3L
8
- OmwnngZ7hv9xJ2fmtVgVAWL9LN7v5aIYJ9EcTmnQxQO7GCrqqGl72DPAxByfGItA
9
- OfjEZZdHd5uyrMVN0/I9XPsIFhH6Zx1iTDhuYnxETiNlqQS/EX0yhmrO5FeZiC7Z
10
- gvN33l70BDHEXPnDA6nP6pk2JdMXn2vBs7l3JtOLCO7mGKpiVrGpEZSspFe4YLI=
11
- =sW38
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
 
@@ -120,7 +120,7 @@
120
120
 
121
121
  #define PASSENGER_DEFAULT_USER "nobody"
122
122
 
123
- #define PASSENGER_VERSION "5.0.17"
123
+ #define PASSENGER_VERSION "5.0.18"
124
124
 
125
125
  #define POOL_HELPER_THREAD_STACK_SIZE 262144
126
126
 
@@ -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 INC_BUFFER_ITER(i) \
452
+ #define BEGIN_PUSH_NEXT_BUFFER() \
453
453
  do { \
454
- if (buffers != NULL && i == maxbuffers) { \
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 INC_BUFFER_ITER(i) \
597
+ #define BEGIN_PUSH_NEXT_BUFFER() \
598
598
  do { \
599
- if (buffers != NULL && i == maxbuffers) { \
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, dataSize, cache);
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,
@@ -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.17'
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.17
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-08 00:00:00.000000000 Z
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
- iQEcBAABAgAGBQJV7ioYAAoJECrHRaUKISqMiEgH/0j/WQ+R1IvFOWDI7X8m8Wa0
6
- cBKEsW/zNGGLLC1zi86EM3r6BZIjmhaADvuq0CPALsVkBdNpKycxxLOe4quA9Brm
7
- a1QVgKmnhimThewopw0TGJTOiYmLdERR9NTeUpuRRkWytUKJem6MvDyNlW52bQwJ
8
- 88QMLHow5Uu8JZoWEfxhX9nizNgESNus+takRHE85WY6G6F2YGMGx3w3eBSX/M2i
9
- 3Ud6Z2D1X1AgdcsVvbHtsOoYap4+IsE/95Y6H3up9DakJN0PfPYn4hHAKoxzX1Ma
10
- +yESKP1UrNBPqrwc5j2eHUaPnKP+hgjcc/QEmOQs7QzeXYneIcOSzPo8j38Zgto=
11
- =7g/4
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-----