/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to plugins.d/mandos-client.c

  • Committer: Teddy Hogeborn
  • Date: 2009-09-05 01:46:42 UTC
  • Revision ID: teddy@fukt.bsnet.se-20090905014642-36108sqop1ci0z0m
* plugins.d/mandos-client.c (start_mandos_communication): Check
                                                         "quit_now"
                                                         throughout.
                                                         Always close
                                                         socket and
                                                         deinit GnuTLS
                                                         properly.
  (browse_callback): Return immediately if "quit_now" is set.

Show diffs side-by-side

added added

removed removed

Lines of Context:
521
521
static int start_mandos_communication(const char *ip, uint16_t port,
522
522
                                      AvahiIfIndex if_index,
523
523
                                      int af){
524
 
  int ret, tcp_sd;
 
524
  int ret, tcp_sd = -1;
525
525
  ssize_t sret;
526
526
  union {
527
527
    struct sockaddr_in in;
537
537
  gnutls_session_t session;
538
538
  int pf;                       /* Protocol family */
539
539
  
 
540
  if(quit_now){
 
541
    return -1;
 
542
  }
 
543
  
540
544
  switch(af){
541
545
  case AF_INET6:
542
546
    pf = PF_INET6;
562
566
  tcp_sd = socket(pf, SOCK_STREAM, 0);
563
567
  if(tcp_sd < 0){
564
568
    perror("socket");
565
 
    return -1;
 
569
    retval = -1;
 
570
    goto mandos_end;
 
571
  }
 
572
  
 
573
  if(quit_now){
 
574
    goto mandos_end;
566
575
  }
567
576
  
568
577
  memset(&to, 0, sizeof(to));
575
584
  }
576
585
  if(ret < 0 ){
577
586
    perror("inet_pton");
578
 
    return -1;
 
587
    retval = -1;
 
588
    goto mandos_end;
579
589
  }
580
590
  if(ret == 0){
581
591
    fprintf(stderr, "Bad address: %s\n", ip);
582
 
    return -1;
 
592
    retval = -1;
 
593
    goto mandos_end;
583
594
  }
584
595
  if(af == AF_INET6){
585
596
    to.in6.sin6_port = htons(port); /* Spurious warnings from
592
603
      if(if_index == AVAHI_IF_UNSPEC){
593
604
        fprintf(stderr, "An IPv6 link-local address is incomplete"
594
605
                " without a network interface\n");
595
 
        return -1;
 
606
        retval = -1;
 
607
        goto mandos_end;
596
608
      }
597
609
      /* Set the network interface number as scope */
598
610
      to.in6.sin6_scope_id = (uint32_t)if_index;
603
615
                                     -Wunreachable-code */
604
616
  }
605
617
  
 
618
  if(quit_now){
 
619
    goto mandos_end;
 
620
  }
 
621
  
606
622
  if(debug){
607
623
    if(af == AF_INET6 and if_index != AVAHI_IF_UNSPEC){
608
624
      char interface[IF_NAMESIZE];
635
651
    }
636
652
  }
637
653
  
 
654
  if(quit_now){
 
655
    goto mandos_end;
 
656
  }
 
657
  
638
658
  if(af == AF_INET6){
639
659
    ret = connect(tcp_sd, &to.in6, sizeof(to));
640
660
  } else {
642
662
  }
643
663
  if(ret < 0){
644
664
    perror("connect");
645
 
    return -1;
 
665
    retval = -1;
 
666
    goto mandos_end;
 
667
  }
 
668
  
 
669
  if(quit_now){
 
670
    goto mandos_end;
646
671
  }
647
672
  
648
673
  const char *out = mandos_protocol_version;
667
692
        break;
668
693
      }
669
694
    }
 
695
  
 
696
    if(quit_now){
 
697
      goto mandos_end;
 
698
    }
670
699
  }
671
700
  
672
701
  if(debug){
673
702
    fprintf(stderr, "Establishing TLS session with %s\n", ip);
674
703
  }
675
704
  
 
705
  if(quit_now){
 
706
    goto mandos_end;
 
707
  }
 
708
  
676
709
  gnutls_transport_set_ptr(session, (gnutls_transport_ptr_t) tcp_sd);
677
710
  
 
711
  if(quit_now){
 
712
    goto mandos_end;
 
713
  }
 
714
  
678
715
  do{
679
716
    ret = gnutls_handshake(session);
 
717
    if(quit_now){
 
718
      goto mandos_end;
 
719
    }
680
720
  } while(ret == GNUTLS_E_AGAIN or ret == GNUTLS_E_INTERRUPTED);
681
721
  
682
722
  if(ret != GNUTLS_E_SUCCESS){
696
736
  }
697
737
  
698
738
  while(true){
 
739
    
 
740
    if(quit_now){
 
741
      goto mandos_end;
 
742
    }
 
743
    
699
744
    buffer_capacity = incbuffer(&buffer, buffer_length,
700
745
                                   buffer_capacity);
701
746
    if(buffer_capacity == 0){
704
749
      goto mandos_end;
705
750
    }
706
751
    
 
752
    if(quit_now){
 
753
      goto mandos_end;
 
754
    }
 
755
    
707
756
    sret = gnutls_record_recv(session, buffer+buffer_length,
708
757
                              BUFFER_SIZE);
709
758
    if(sret == 0){
717
766
      case GNUTLS_E_REHANDSHAKE:
718
767
        do{
719
768
          ret = gnutls_handshake(session);
 
769
          
 
770
          if(quit_now){
 
771
            goto mandos_end;
 
772
          }
720
773
        } while(ret == GNUTLS_E_AGAIN or ret == GNUTLS_E_INTERRUPTED);
721
774
        if(ret < 0){
722
775
          fprintf(stderr, "*** GnuTLS Re-handshake failed ***\n");
741
794
    fprintf(stderr, "Closing TLS session\n");
742
795
  }
743
796
  
 
797
  if(quit_now){
 
798
    goto mandos_end;
 
799
  }
 
800
  
744
801
  gnutls_bye(session, GNUTLS_SHUT_RDWR);
745
802
  
 
803
  if(quit_now){
 
804
    goto mandos_end;
 
805
  }
 
806
  
746
807
  if(buffer_length > 0){
747
808
    decrypted_buffer_size = pgp_packet_decrypt(buffer,
748
809
                                               buffer_length,
750
811
    if(decrypted_buffer_size >= 0){
751
812
      written = 0;
752
813
      while(written < (size_t) decrypted_buffer_size){
 
814
        if(quit_now){
 
815
          goto mandos_end;
 
816
        }
 
817
        
753
818
        ret = (int)fwrite(decrypted_buffer + written, 1,
754
819
                          (size_t)decrypted_buffer_size - written,
755
820
                          stdout);
775
840
  
776
841
 mandos_end:
777
842
  free(buffer);
778
 
  ret = (int)TEMP_FAILURE_RETRY(close(tcp_sd));
 
843
  if(tcp_sd >= 0){
 
844
    ret = (int)TEMP_FAILURE_RETRY(close(tcp_sd));
 
845
  }
779
846
  if(ret == -1){
780
847
    perror("close");
781
848
  }
782
849
  gnutls_deinit(session);
 
850
  if(quit_now){
 
851
    retval = -1;
 
852
  }
783
853
  return retval;
784
854
}
785
855
 
848
918
  /* Called whenever a new services becomes available on the LAN or
849
919
     is removed from the LAN */
850
920
  
 
921
  if(quit_now){
 
922
    return;
 
923
  }
 
924
  
851
925
  switch(event){
852
926
  default:
853
927
  case AVAHI_BROWSER_FAILURE: