Commit 4cb25215 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

test506: verify aa688484

After the fixed cookie lock deadlock, this test now passes and it
detects double-locking and double-unlocking of mutexes.
parent aa688484
Loading
Loading
Loading
Loading
+14 −16
Original line number Diff line number Diff line
@@ -156,33 +156,31 @@ unlock: share [Pigs in space]: 53
CURLOPT_COOKIEJAR
CURLOPT_COOKIELIST FLUSH
lock:   cookie [Pigs in space]: 54
lock:   cookie [Pigs in space]: 55
unlock: cookie [Pigs in space]: 56
unlock: cookie [Pigs in space]: 57
unlock: cookie [Pigs in space]: 55
PERFORM
lock:   dns    [Pigs in space]: 58
unlock: dns    [Pigs in space]: 59
lock:   dns    [Pigs in space]: 56
unlock: dns    [Pigs in space]: 57
lock:   cookie [Pigs in space]: 58
unlock: cookie [Pigs in space]: 59
lock:   cookie [Pigs in space]: 60
unlock: cookie [Pigs in space]: 61
lock:   cookie [Pigs in space]: 62
unlock: cookie [Pigs in space]: 63
lock:   cookie [Pigs in space]: 64
unlock: cookie [Pigs in space]: 65
run 3: overwrite cookie 1 and 4
lock:   dns    [Pigs in space]: 66
unlock: dns    [Pigs in space]: 67
lock:   dns    [Pigs in space]: 64
unlock: dns    [Pigs in space]: 65
try SHARE_CLEANUP...
lock:   share  [Pigs in space]: 68
unlock: share  [Pigs in space]: 69
lock:   share  [Pigs in space]: 66
unlock: share  [Pigs in space]: 67
SHARE_CLEANUP failed, correct
CLEANUP
lock:   cookie [Pigs in space]: 70
unlock: cookie [Pigs in space]: 71
lock:   cookie [Pigs in space]: 68
unlock: cookie [Pigs in space]: 69
lock:   share  [Pigs in space]: 70
unlock: share  [Pigs in space]: 71
SHARE_CLEANUP
lock:   share  [Pigs in space]: 72
unlock: share  [Pigs in space]: 73
SHARE_CLEANUP
lock:   share  [Pigs in space]: 74
unlock: share  [Pigs in space]: 75
GLOBAL_CLEANUP
</stdout>
<stderr>
+27 −1
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
 * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
@@ -40,12 +40,15 @@ struct userdata {
  int counter;
};

int lock[3];

/* lock callback */
static void my_lock(CURL *handle, curl_lock_data data, curl_lock_access laccess,
          void *useptr )
{
  const char *what;
  struct userdata *user = (struct userdata *)useptr;
  int locknum;

  (void)handle;
  (void)laccess;
@@ -53,17 +56,28 @@ static void my_lock(CURL *handle, curl_lock_data data, curl_lock_access laccess,
  switch ( data ) {
    case CURL_LOCK_DATA_SHARE:
      what = "share";
      locknum = 0;
      break;
    case CURL_LOCK_DATA_DNS:
      what = "dns";
      locknum = 1;
      break;
    case CURL_LOCK_DATA_COOKIE:
      what = "cookie";
      locknum = 2;
      break;
    default:
      fprintf(stderr, "lock: no such data: %d\n", (int)data);
      return;
  }

  /* detect locking of locked locks */
  if(lock[locknum]) {
    printf("lock: double locked %s\n", what);
    return;
  }
  lock[locknum]++;

  printf("lock:   %-6s [%s]: %d\n", what, user->text, user->counter);
  user->counter++;
}
@@ -73,21 +87,33 @@ static void my_unlock(CURL *handle, curl_lock_data data, void *useptr )
{
  const char *what;
  struct userdata *user = (struct userdata *)useptr;
  int locknum;
  (void)handle;
  switch ( data ) {
    case CURL_LOCK_DATA_SHARE:
      what = "share";
      locknum = 0;
      break;
    case CURL_LOCK_DATA_DNS:
      what = "dns";
      locknum = 1;
      break;
    case CURL_LOCK_DATA_COOKIE:
      what = "cookie";
      locknum = 2;
      break;
    default:
      fprintf(stderr, "unlock: no such data: %d\n", (int)data);
      return;
  }

  /* detect unlocking of unlocked locks */
  if(!lock[locknum]) {
    printf("unlock: double unlocked %s\n", what);
    return;
  }
  lock[locknum]--;

  printf("unlock: %-6s [%s]: %d\n", what, user->text, user->counter);
  user->counter++;
}