/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: 2014-03-10 06:55:54 UTC
  • Revision ID: teddy@recompile.se-20140310065554-of3kz8jdhlll42l3
Use "struct sockaddr_storage" instead of a union in mandos-client.

Apparently using struct sockaddr_storage the way POSIX intended is
incompatible with strict aliasing, so turn that off in the Makefile.

* plugins.d/mandos-client.c (start_mandos_communication): Change "to"
                                                          from a union
                                                          to a struct
                                                          sockaddr_storage.
* Makefile (OPTIMIZE): Add "-fno-strict-aliasing".

Show diffs side-by-side

added added

removed removed

Lines of Context:
634
634
                                      int af, mandos_context *mc){
635
635
  int ret, tcp_sd = -1;
636
636
  ssize_t sret;
637
 
  union {
638
 
    struct sockaddr_in in;
639
 
    struct sockaddr_in6 in6;
640
 
  } to;
 
637
  struct sockaddr_storage to;
641
638
  char *buffer = NULL;
642
639
  char *decrypted_buffer = NULL;
643
640
  size_t buffer_length = 0;
724
721
  
725
722
  memset(&to, 0, sizeof(to));
726
723
  if(af == AF_INET6){
727
 
    to.in6.sin6_family = (sa_family_t)af;
728
 
    ret = inet_pton(af, ip, &to.in6.sin6_addr);
 
724
    ((struct sockaddr_in6 *)&to)->sin6_family = (sa_family_t)af;
 
725
    ret = inet_pton(af, ip, &((struct sockaddr_in6 *)&to)->sin6_addr);
729
726
  } else {                      /* IPv4 */
730
 
    to.in.sin_family = (sa_family_t)af;
731
 
    ret = inet_pton(af, ip, &to.in.sin_addr);
 
727
    ((struct sockaddr_in *)&to)->sin_family = (sa_family_t)af;
 
728
    ret = inet_pton(af, ip, &((struct sockaddr_in *)&to)->sin_addr);
732
729
  }
733
730
  if(ret < 0 ){
734
731
    int e = errno;
743
740
    goto mandos_end;
744
741
  }
745
742
  if(af == AF_INET6){
746
 
    to.in6.sin6_port = htons(port);    
747
 
#ifdef __GNUC__
748
 
#pragma GCC diagnostic push
749
 
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
750
 
#endif
751
 
    if(IN6_IS_ADDR_LINKLOCAL /* Spurious warnings from */
752
 
       (&to.in6.sin6_addr)){ /* -Wstrict-aliasing=2 or lower */
753
 
#ifdef __GNUC__
754
 
#pragma GCC diagnostic pop
755
 
#endif
 
743
    ((struct sockaddr_in6 *)&to)->sin6_port = htons(port);    
 
744
    if(IN6_IS_ADDR_LINKLOCAL
 
745
       (&((struct sockaddr_in6 *)&to)->sin6_addr)){
756
746
      if(if_index == AVAHI_IF_UNSPEC){
757
747
        fprintf_plus(stderr, "An IPv6 link-local address is"
758
748
                     " incomplete without a network interface\n");
760
750
        goto mandos_end;
761
751
      }
762
752
      /* Set the network interface number as scope */
763
 
      to.in6.sin6_scope_id = (uint32_t)if_index;
 
753
      ((struct sockaddr_in6 *)&to)->sin6_scope_id = (uint32_t)if_index;
764
754
    }
765
755
  } else {
766
 
    to.in.sin_port = htons(port);
 
756
    ((struct sockaddr_in *)&to)->sin_port = htons(port);
767
757
  }
768
758
  
769
759
  if(quit_now){
787
777
    char addrstr[(INET_ADDRSTRLEN > INET6_ADDRSTRLEN) ?
788
778
                 INET_ADDRSTRLEN : INET6_ADDRSTRLEN] = "";
789
779
    if(af == AF_INET6){
790
 
      ret = getnameinfo((struct sockaddr *)&(to.in6), sizeof(to.in6),
 
780
      ret = getnameinfo((struct sockaddr *)&to,
 
781
                        sizeof(struct sockaddr_in6),
791
782
                        addrstr, sizeof(addrstr), NULL, 0,
792
783
                        NI_NUMERICHOST);
793
784
    } else {
794
 
      ret = getnameinfo((struct sockaddr *)&(to.in), sizeof(to.in),
 
785
      ret = getnameinfo((struct sockaddr *)&to,
 
786
                        sizeof(struct sockaddr_in),
795
787
                        addrstr, sizeof(addrstr), NULL, 0,
796
788
                        NI_NUMERICHOST);
797
789
    }
810
802
  }
811
803
  
812
804
  if(af == AF_INET6){
813
 
    ret = connect(tcp_sd, &to.in6, sizeof(to));
 
805
    ret = connect(tcp_sd, (struct sockaddr *)&to,
 
806
                  sizeof(struct sockaddr_in6));
814
807
  } else {
815
 
    ret = connect(tcp_sd, &to.in, sizeof(to)); /* IPv4 */
 
808
    ret = connect(tcp_sd, (struct sockaddr *)&to, /* IPv4 */
 
809
                  sizeof(struct sockaddr_in));
816
810
  }
817
811
  if(ret < 0){
818
812
    if ((errno != ECONNREFUSED and errno != ENETUNREACH) or debug){