Print this page
8927 sadb_x_kmc_t's KM cookie should be 64-bits (fix improper upstream)
        
*** 24,62 ****
  
  #define COOKIE64 0xc0ffee4afee01deaULL
  #define COOKIE32 0x90125
  #define RESERVED 0xc0ffee
  
  /*
   * Exits app on failure.
   */
  static void
  write_and_read(int s, sadb_msg_t *samsg, uint64_t *readbuf, int readlen,
      char *msgtypestr)
  {
!         int rc;
          uint8_t msgtype = samsg->sadb_msg_type;
          pid_t pid = samsg->sadb_msg_pid;
          uint8_t seq = samsg->sadb_msg_seq;
  
          rc = write(s, samsg, SADB_64TO8(samsg->sadb_msg_len));
          if (rc == -1)
!                 err(-1, "%s write error", msgtypestr);
  
          /* Yes, parameter re-use, but we're done writing. */
          samsg = (sadb_msg_t *)readbuf;
          do {
                  rc = read(s, readbuf, readlen);
                  if (rc == -1)
!                         err(-1, "%s read reply error", msgtypestr);
          } while (samsg->sadb_msg_seq != seq || samsg->sadb_msg_pid != pid ||
              samsg->sadb_msg_type != msgtype);
  
          if (samsg->sadb_msg_errno != 0) {
                  errno = samsg->sadb_msg_errno;
!                 err(-1, "%s reply has error (diag = %d)", msgtypestr,
!                     samsg->sadb_x_msg_diagnostic);
          }
  }
  
  int
  main(int argc, char *argv[])
--- 24,66 ----
  
  #define COOKIE64 0xc0ffee4afee01deaULL
  #define COOKIE32 0x90125
  #define RESERVED 0xc0ffee
  
+ #define EXIT_SETUP_FAIL -1
+ #define EXIT_TEST_FAIL 1
+ #define EXIT_SUCCESS 0
+ 
  /*
   * Exits app on failure.
   */
  static void
  write_and_read(int s, sadb_msg_t *samsg, uint64_t *readbuf, int readlen,
      char *msgtypestr)
  {
!         ssize_t rc;
          uint8_t msgtype = samsg->sadb_msg_type;
          pid_t pid = samsg->sadb_msg_pid;
          uint8_t seq = samsg->sadb_msg_seq;
  
          rc = write(s, samsg, SADB_64TO8(samsg->sadb_msg_len));
          if (rc == -1)
!                 err(EXIT_SETUP_FAIL, "%s write error", msgtypestr);
  
          /* Yes, parameter re-use, but we're done writing. */
          samsg = (sadb_msg_t *)readbuf;
          do {
                  rc = read(s, readbuf, readlen);
                  if (rc == -1)
!                         err(EXIT_SETUP_FAIL, "%s read reply error", msgtypestr);
          } while (samsg->sadb_msg_seq != seq || samsg->sadb_msg_pid != pid ||
              samsg->sadb_msg_type != msgtype);
  
          if (samsg->sadb_msg_errno != 0) {
                  errno = samsg->sadb_msg_errno;
!                 err(EXIT_SETUP_FAIL, "%s reply has error (diag = %d)",
!                     msgtypestr, samsg->sadb_x_msg_diagnostic);
          }
  }
  
  int
  main(int argc, char *argv[])
*** 76,103 ****
          int s;
  
          if (argc != 2 && argc != 3) {
                  (void) fprintf(stderr, "Usage: %s <spi-value> {64}\n",
                      argv[0]);
!                 exit(-1);
          }
          do_64_test = (argc == 3);
  
          spi = strtoul(argv[1], NULL, 0);
          if (spi == 0) {
                  if (errno != 0) {
!                         err(-1, "Argument %s is not a parsable number:",
!                             argv[1]);
                  } else {
                          errno = EINVAL;
!                         err(-1, "Zero SPI not allowed:");
                  }
          }
  
          s = socket(PF_KEY, SOCK_RAW, PF_KEY_V2);
          if (s == -1)
!                 err(-1, "socket(PF_KEY)");
  
          /* Base message. */
          samsg = (sadb_msg_t *)writebuf;
          samsg->sadb_msg_version = PF_KEY_V2;
          samsg->sadb_msg_type = SADB_UPDATE;
--- 80,108 ----
          int s;
  
          if (argc != 2 && argc != 3) {
                  (void) fprintf(stderr, "Usage: %s <spi-value> {64}\n",
                      argv[0]);
!                 exit(EXIT_SETUP_FAIL);
          }
          do_64_test = (argc == 3);
  
+         errno = 0;      /* Clear for strtoul() call. */
          spi = strtoul(argv[1], NULL, 0);
          if (spi == 0) {
                  if (errno != 0) {
!                         err(EXIT_SETUP_FAIL,
!                             "Argument %s is not a parsable number:", argv[1]);
                  } else {
                          errno = EINVAL;
!                         err(EXIT_SETUP_FAIL, "Zero SPI not allowed:");
                  }
          }
  
          s = socket(PF_KEY, SOCK_RAW, PF_KEY_V2);
          if (s == -1)
!                 err(EXIT_SETUP_FAIL, "socket(PF_KEY)");
  
          /* Base message. */
          samsg = (sadb_msg_t *)writebuf;
          samsg->sadb_msg_version = PF_KEY_V2;
          samsg->sadb_msg_type = SADB_UPDATE;
*** 183,193 ****
                  ext = (sadb_ext_t *)extptr;
          }
  
          if (extptr == endptr) {
                  (void) fprintf(stderr, "Can't find KMC extension in reply.\n");
!                 exit(-1);
          }
          kmcext = (sadb_x_kmc_t *)extptr;
  
          if (do_64_test) {
                  if (kmcext->sadb_x_kmc_proto != SADB_X_KMP_KINK ||
--- 188,198 ----
                  ext = (sadb_ext_t *)extptr;
          }
  
          if (extptr == endptr) {
                  (void) fprintf(stderr, "Can't find KMC extension in reply.\n");
!                 exit(EXIT_SETUP_FAIL);
          }
          kmcext = (sadb_x_kmc_t *)extptr;
  
          if (do_64_test) {
                  if (kmcext->sadb_x_kmc_proto != SADB_X_KMP_KINK ||
*** 196,206 ****
                              "KMC received was %d, expecting %d,\n",
                              kmcext->sadb_x_kmc_proto, SADB_X_KMP_KINK);
                          (void) fprintf(stderr, "64-bit cookie recevied was "
                              "0x%"PRIx64", expecting 0x%"PRIx64"\n",
                              kmcext->sadb_x_kmc_cookie64, COOKIE64);
!                         exit(1);
                  }
          } else {
                  if (kmcext->sadb_x_kmc_proto != SADB_X_KMP_IKE ||
                      kmcext->sadb_x_kmc_cookie != COOKIE32 ||
                      kmcext->sadb_x_kmc_reserved != 0) {
--- 201,211 ----
                              "KMC received was %d, expecting %d,\n",
                              kmcext->sadb_x_kmc_proto, SADB_X_KMP_KINK);
                          (void) fprintf(stderr, "64-bit cookie recevied was "
                              "0x%"PRIx64", expecting 0x%"PRIx64"\n",
                              kmcext->sadb_x_kmc_cookie64, COOKIE64);
!                         exit(EXIT_TEST_FAIL);
                  }
          } else {
                  if (kmcext->sadb_x_kmc_proto != SADB_X_KMP_IKE ||
                      kmcext->sadb_x_kmc_cookie != COOKIE32 ||
                      kmcext->sadb_x_kmc_reserved != 0) {
*** 211,221 ****
                              "0x%"PRIx32", expecting 0x%"PRIx32"\n",
                              kmcext->sadb_x_kmc_cookie64, COOKIE32);
                          (void) fprintf(stderr, "32-bit reserved recevied was "
                              "0x%"PRIx32", expecting 0\n",
                              kmcext->sadb_x_kmc_cookie64);
!                         exit(1);
                  }
          }
  
!         exit(0);
  }
--- 216,226 ----
                              "0x%"PRIx32", expecting 0x%"PRIx32"\n",
                              kmcext->sadb_x_kmc_cookie64, COOKIE32);
                          (void) fprintf(stderr, "32-bit reserved recevied was "
                              "0x%"PRIx32", expecting 0\n",
                              kmcext->sadb_x_kmc_cookie64);
!                         exit(EXIT_TEST_FAIL);
                  }
          }
  
!         exit(EXIT_SUCCESS);
  }