Skip to content

Commit

Permalink
Bug 794316 - PR_PushIOLayer doesn't push layer on the top correctly, …
Browse files Browse the repository at this point in the history
…r=wtc
  • Loading branch information
vonasek committed Sep 28, 2012
1 parent 0c5ed99 commit 7730c58
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 0 deletions.
9 changes: 9 additions & 0 deletions nsprpub/pr/src/io/prlayer.c
Original file line number Diff line number Diff line change
Expand Up @@ -523,6 +523,11 @@ PR_IMPLEMENT(PRStatus) PR_PushIOLayer(
*stack = *fd;
*fd = copy;
fd->higher = stack;
if (fd->lower)
{
PR_ASSERT(fd->lower->higher == stack);
fd->lower->higher = fd;
}
stack->lower = fd;
stack->higher = NULL;
} else {
Expand Down Expand Up @@ -561,6 +566,10 @@ PR_IMPLEMENT(PRFileDesc*) PR_PopIOLayer(PRFileDesc *stack, PRDescIdentity id)
*stack = *extract;
*extract = copy;
stack->higher = NULL;
if (stack->lower) {
PR_ASSERT(stack->lower->higher == extract);
stack->lower->higher = stack;
}
} else if ((PR_IO_LAYER_HEAD == stack->identity) &&
(extract == stack->lower) && (extract->lower == NULL)) {
/*
Expand Down
1 change: 1 addition & 0 deletions nsprpub/pr/tests/Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ CSRCS = \
provider.c \
prpoll.c \
prpollml.c \
pushtop.c \
ranfile.c \
randseed.c \
reinit.c \
Expand Down
73 changes: 73 additions & 0 deletions nsprpub/pr/tests/pushtop.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/* A regression test for bug 794316 */

#include <stdio.h>
#include <stdlib.h>

#include "prio.h"

static PRIOMethods dummyMethods;

int main()
{
PRDescIdentity topId, middleId, bottomId;
PRFileDesc *top, *middle, *bottom;
PRFileDesc *fd;

topId = PR_GetUniqueIdentity("top");
middleId = PR_GetUniqueIdentity("middle");
bottomId = PR_GetUniqueIdentity("bottom");

top = PR_CreateIOLayerStub(topId, &dummyMethods);
middle = PR_CreateIOLayerStub(middleId, &dummyMethods);
bottom = PR_CreateIOLayerStub(bottomId, &dummyMethods);

fd = bottom;
PR_PushIOLayer(fd, PR_TOP_IO_LAYER, middle);
PR_PushIOLayer(fd, PR_TOP_IO_LAYER, top);

top = fd;
middle = top->lower;
bottom = middle->lower;

/* Verify that the higher pointers are correct. */
if (middle->higher != top) {
fprintf(stderr, "middle->higher is wrong\n");
fprintf(stderr, "FAILED\n");
exit(1);
}
if (bottom->higher != middle) {
fprintf(stderr, "bottom->higher is wrong\n");
fprintf(stderr, "FAILED\n");
exit(1);
}

top = PR_PopIOLayer(fd, topId);
top->dtor(top);

middle = fd;
bottom = middle->lower;

/* Verify that the higher pointer is correct. */
if (bottom->higher != middle) {
fprintf(stderr, "bottom->higher is wrong\n");
fprintf(stderr, "FAILED\n");
exit(1);
}

middle = PR_PopIOLayer(fd, middleId);
middle->dtor(middle);
if (fd->identity != bottomId) {
fprintf(stderr, "The bottom layer has the wrong identity\n");
fprintf(stderr, "FAILED\n");
exit(1);
}
fd->dtor(fd);

printf("PASS\n");
return 0;
}
1 change: 1 addition & 0 deletions nsprpub/pr/tests/runtests.pl
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ sub win_test_prog {
"primblok",
"provider",
"prpollml",
"pushtop",
"ranfile",
"randseed",
"reinit",
Expand Down
1 change: 1 addition & 0 deletions nsprpub/pr/tests/runtests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ prftest
primblok
provider
prpollml
pushtop
ranfile
randseed
reinit
Expand Down

0 comments on commit 7730c58

Please sign in to comment.