Module Name:    src
Committed By:   yamt
Date:           Wed Nov  2 16:43:04 UTC 2011

Modified Files:
        src/lib/libpuffs: callcontext.c

Log Message:
puffs_cc_yield: fix a cc leak.  PR/44679


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/lib/libpuffs/callcontext.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libpuffs/callcontext.c
diff -u src/lib/libpuffs/callcontext.c:1.25 src/lib/libpuffs/callcontext.c:1.26
--- src/lib/libpuffs/callcontext.c:1.25	Fri Mar  4 09:47:47 2011
+++ src/lib/libpuffs/callcontext.c	Wed Nov  2 16:43:04 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: callcontext.c,v 1.25 2011/03/04 09:47:47 yamt Exp $	*/
+/*	$NetBSD: callcontext.c,v 1.26 2011/11/02 16:43:04 yamt Exp $	*/
 
 /*
  * Copyright (c) 2006, 2007, 2008 Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
 
 #include <sys/cdefs.h>
 #if !defined(lint)
-__RCSID("$NetBSD: callcontext.c,v 1.25 2011/03/04 09:47:47 yamt Exp $");
+__RCSID("$NetBSD: callcontext.c,v 1.26 2011/11/02 16:43:04 yamt Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>
@@ -78,6 +78,14 @@ puffs_cc_yield(struct puffs_cc *pcc)
 
 	assert(puffs_fakecc == 0);
 
+	if ((~pcc->pcc_flags & (PCC_BORROWED|PCC_DONE)) == 0) {
+		pcc->pcc_flags &= ~(PCC_BORROWED|PCC_DONE);
+		/*
+		 * see the XXX comment in puffs__cc_cont
+		 */
+		puffs__cc_destroy(pcc, 1);
+		setcontext(&pcc->pcc_uc_ret);
+	}
 	pcc->pcc_flags &= ~PCC_BORROWED;
 
 	/* romanes eunt domus */

Reply via email to