rogfer01 added a comment.

Firefox build shows a couple of warnings in the sctp library that already gave 
warnings with the earlier patches.

That code has the following structure.

  #define SCTP_PACKED __attribute__((packed))
  #define SCTP_IDENTIFICATION_SIZE 16
  // ...
  /* state cookie header */
  struct sctp_state_cookie {    /* this is our definition... */
        uint8_t identification[SCTP_IDENTIFICATION_SIZE];/* id of who we are */
        struct timeval time_entered;    /* the time I built cookie */
          // other fields
  } SCTP_PACKED;

The warning is triggered by the following code (the other occurence is almost 
exact).

  net->RTO = sctp_calculate_rto(stcb, asoc, net,
                                      &cookie->time_entered,   // ← warning 
here!
                                      sctp_align_unsafe_makecopy,
                                      SCTP_RTT_FROM_NON_DATA);

the called function being declared as

  uint32_t
  sctp_calculate_rto(struct sctp_tcb *stcb,
                   struct sctp_association *asoc,
                   struct sctp_nets *net,
                   struct timeval *told,
                   int safe, int rtt_from_sack)
  {
    ...

So I think that is a legitimate warning.

But the code is working (assuming this function is ever called that I didn't 
check). Checking the code, though, reveals a curious usage of `told`.

        /* Copy it out for sparc64 */
        if (safe == sctp_align_unsafe_makecopy) {
                old = &then;
                memcpy(&then, told, sizeof(struct timeval));
        } else if (safe == sctp_align_safe_nocopy) {
                old = told;
        } else {
                /* error */
                SCTP_PRINTF("Huh, bad rto calc call\n");
                return (0);
        }

which suggests that the code somehow knows that the pointer is unaligned and 
cannot be copied straightforwardly.

We can cast to `void*` and back to the original pointer type.

  net->RTO = sctp_calculate_rto(stcb, asoc, net,
                                      (struct 
timeval*)(void*)&cookie->time_entered, // note: the cast is because this 
pointer is unaligned
                                      sctp_align_unsafe_makecopy,
                                      SCTP_RTT_FROM_NON_DATA);

Which looks a bit ugly to me but clearly pinpoints a problem and can be wrapped 
in a macro.

  #define UNALIGNED_ADDRESS(x) ((__typeof__(x))(void*)(x))
  
  ...
  
  net->RTO = sctp_calculate_rto(stcb, asoc, net,
                                      UNALIGNED_ADDRESS(&cookie->time_entered),
                                      sctp_align_unsafe_makecopy,
                                      SCTP_RTT_FROM_NON_DATA);

What do you think?


http://reviews.llvm.org/D20561



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to