~ubuntu-branches/ubuntu/saucy/nspr/saucy-updates

« back to all changes in this revision

Viewing changes to mozilla/nsprpub/pr/src/io/prlayer.c

  • Committer: Package Import Robot
  • Author(s): Timo Aaltonen
  • Date: 2012-11-27 17:39:22 UTC
  • mfrom: (1.1.15) (27.1.1 raring-proposed)
  • Revision ID: package-import@ubuntu.com-20121127173922-1zfbtwmy1vczqwxq
Tags: 2:4.9.3-1ubuntu1
* Merge from Debian unstable.  Remaining changes:
  - rules: Enable Thumb2 build on armel, armhf.
  - control: Change Vcs-* to XS-Debian-Vcs-*.
  - control: Add conflicts to evolution-documentation-*,
    language-support-translation-*.
  - control: Add Breaks: evolution-plugins.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
 
/* ***** BEGIN LICENSE BLOCK *****
3
 
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4
 
 *
5
 
 * The contents of this file are subject to the Mozilla Public License Version
6
 
 * 1.1 (the "License"); you may not use this file except in compliance with
7
 
 * the License. You may obtain a copy of the License at
8
 
 * http://www.mozilla.org/MPL/
9
 
 *
10
 
 * Software distributed under the License is distributed on an "AS IS" basis,
11
 
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12
 
 * for the specific language governing rights and limitations under the
13
 
 * License.
14
 
 *
15
 
 * The Original Code is the Netscape Portable Runtime (NSPR).
16
 
 *
17
 
 * The Initial Developer of the Original Code is
18
 
 * Netscape Communications Corporation.
19
 
 * Portions created by the Initial Developer are Copyright (C) 1998-2000
20
 
 * the Initial Developer. All Rights Reserved.
21
 
 *
22
 
 * Contributor(s):
23
 
 *
24
 
 * Alternatively, the contents of this file may be used under the terms of
25
 
 * either the GNU General Public License Version 2 or later (the "GPL"), or
26
 
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27
 
 * in which case the provisions of the GPL or the LGPL are applicable instead
28
 
 * of those above. If you wish to allow use of your version of this file only
29
 
 * under the terms of either the GPL or the LGPL, and not to allow others to
30
 
 * use your version of this file under the terms of the MPL, indicate your
31
 
 * decision by deleting the provisions above and replace them with the notice
32
 
 * and other provisions required by the GPL or the LGPL. If you do not delete
33
 
 * the provisions above, a recipient may use your version of this file under
34
 
 * the terms of any one of the MPL, the GPL or the LGPL.
35
 
 *
36
 
 * ***** END LICENSE BLOCK ***** */
 
2
/* This Source Code Form is subject to the terms of the Mozilla Public
 
3
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 
4
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
37
5
 
38
6
/*
39
7
** File:        prlayer.c
555
523
                *stack = *fd;
556
524
                *fd = copy;
557
525
                fd->higher = stack;
 
526
                if (fd->lower)
 
527
                {
 
528
                        PR_ASSERT(fd->lower->higher == stack);
 
529
                        fd->lower->higher = fd;
 
530
                }
558
531
                stack->lower = fd;
559
532
                stack->higher = NULL;
560
533
        } else {
593
566
        *stack = *extract;
594
567
        *extract = copy;
595
568
        stack->higher = NULL;
 
569
        if (stack->lower) {
 
570
            PR_ASSERT(stack->lower->higher == extract);
 
571
            stack->lower->higher = stack;
 
572
        }
596
573
        } else if ((PR_IO_LAYER_HEAD == stack->identity) &&
597
574
                                        (extract == stack->lower) && (extract->lower == NULL)) {
598
575
                        /*
644
621
    /* this initial code runs unsafe */
645
622
retry:
646
623
    PR_ASSERT(NULL == names);
 
624
    /*
 
625
     * In the initial round, both identity_cache.ident and
 
626
     * identity_cache.length are 0, so (identity_cache.ident + 1) is greater
 
627
     * than length.  In later rounds, identity_cache.ident is always less
 
628
     * than length, so (identity_cache.ident + 1) can be equal to but cannot
 
629
     * be greater than length.
 
630
     */
647
631
    length = identity_cache.length;
648
 
    if (length < (identity_cache.ident + 1))
 
632
    if ((identity_cache.ident + 1) >= length)
649
633
    {
650
634
        length += ID_CACHE_INCREMENT;
651
635
        names = (char**)PR_CALLOC(length * sizeof(char*));
659
643
 
660
644
    /* now we get serious about thread safety */
661
645
    PR_Lock(identity_cache.ml);
662
 
    PR_ASSERT(identity_cache.ident <= identity_cache.length);
 
646
    PR_ASSERT(identity_cache.length == 0 ||
 
647
              identity_cache.ident < identity_cache.length);
663
648
    identity = identity_cache.ident + 1;
664
 
    if (identity > identity_cache.length)  /* there's no room */
 
649
    if (identity >= identity_cache.length)  /* there's no room */
665
650
    {
666
651
        /* we have to do something - hopefully it's already done */
667
 
        if ((NULL != names) && (length >= identity))
 
652
        if ((NULL != names) && (identity < length))
668
653
        {
669
654
            /* what we did is still okay */
670
655
            memcpy(
677
662
        }
678
663
        else
679
664
        {
680
 
            PR_ASSERT(identity_cache.ident <= identity_cache.length);
681
665
            PR_Unlock(identity_cache.ml);
682
666
            if (NULL != names) PR_DELETE(names);
683
667
            goto retry;
688
672
        identity_cache.name[identity] = name;
689
673
    }
690
674
    identity_cache.ident = identity;
691
 
    PR_ASSERT(identity_cache.ident <= identity_cache.length);
 
675
    PR_ASSERT(identity_cache.ident < identity_cache.length);
692
676
    PR_Unlock(identity_cache.ml);
693
677
 
694
678
    if (NULL != old) PR_DELETE(old);