Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(404)

Unified Diff: nss/lib/util/secitem.c

Issue 13898013: Update NSS to NSS_3_15_BETA2. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/nss/
Patch Set: Update NSS versions and tag in README.chromium Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: nss/lib/util/secitem.c
===================================================================
--- nss/lib/util/secitem.c (revision 195639)
+++ nss/lib/util/secitem.c (working copy)
@@ -5,13 +5,14 @@
/*
* Support routines for SECItem data structure.
*
- * $Id: secitem.c,v 1.18 2012/04/25 14:50:16 gerv%gerv.net Exp $
+ * $Id$
*/
#include "seccomon.h"
#include "secitem.h"
#include "base64.h"
#include "secerr.h"
+#include "secport.h"
SECItem *
SECITEM_AllocItem(PRArenaPool *arena, SECItem *item, unsigned int len)
@@ -294,3 +295,125 @@
return SECITEM_ItemsAreEqual(i1,i2);
}
+
+SECItemArray *
+SECITEM_AllocArray(PLArenaPool *arena, SECItemArray *array, unsigned int len)
+{
+ SECItemArray *result = NULL;
+ void *mark = NULL;
+
+ if (arena != NULL) {
+ mark = PORT_ArenaMark(arena);
+ }
+
+ if (array == NULL) {
+ if (arena != NULL) {
+ result = PORT_ArenaZAlloc(arena, sizeof(SECItemArray));
+ } else {
+ result = PORT_ZAlloc(sizeof(SECItemArray));
+ }
+ if (result == NULL) {
+ goto loser;
+ }
+ } else {
+ PORT_Assert(array->items == NULL);
+ result = array;
+ }
+
+ result->len = len;
+ if (len) {
+ if (arena != NULL) {
+ result->items = PORT_ArenaZNewArray(arena, SECItem, len);
+ } else {
+ result->items = PORT_ZNewArray(SECItem, len);
+ }
+ if (result->items == NULL) {
+ goto loser;
+ }
+ } else {
+ result->items = NULL;
+ }
+
+ if (mark) {
+ PORT_ArenaUnmark(arena, mark);
+ }
+ return(result);
+
+loser:
+ if ( arena != NULL ) {
+ if (mark) {
+ PORT_ArenaRelease(arena, mark);
+ }
+ if (array != NULL) {
+ array->items = NULL;
+ array->len = 0;
+ }
+ } else {
+ if (result != NULL && array == NULL) {
+ PORT_Free(result);
+ }
+ /*
+ * If array is not NULL, the above has set array->data and
wtc 2013/04/24 22:49:45 This comment needs to be updated to say array->ite
+ * array->len to 0.
+ */
+ }
+ return(NULL);
+}
+
+void secitem_FreeArray(SECItemArray *array, PRBool zero_items, PRBool freeit)
wtc 2013/04/24 22:49:45 Mark this static.
+{
+ unsigned int i;
+
+ if (!array || !array->len || !array->items)
+ return;
+
+ for (i=0; i<array->len; ++i) {
wtc 2013/04/24 22:49:45 Add spaces around operators.
+ SECItem *item = &array->items[i];
+
+ if (item->data) {
+ if (zero_items) {
+ SECITEM_ZfreeItem(item, PR_FALSE);
+ } else {
+ SECITEM_FreeItem(item, PR_FALSE);
+ }
+ }
+ }
+
wtc 2013/04/24 22:49:45 BUG: array->items also needs to be freed.
+ if (freeit)
+ PORT_Free(array);
+}
+
+void SECITEM_FreeArray(SECItemArray *array, PRBool freeit)
+{
+ secitem_FreeArray(array, PR_FALSE, freeit);
+}
+
+void SECITEM_ZfreeArray(SECItemArray *array, PRBool freeit)
+{
+ secitem_FreeArray(array, PR_TRUE, freeit);
+}
+
+SECItemArray *
+SECITEM_DupArray(PLArenaPool *arena, const SECItemArray *from)
+{
+ SECItemArray *result;
+ unsigned int i;
+
+ if (!from || !from->items || !from->len)
wtc 2013/04/24 22:49:45 I think it is legal for from->items to be NULL.
+ return NULL;
+
+ result = SECITEM_AllocArray(arena, NULL, from->len);
+ if (!result)
+ return NULL;
+
+ for (i=0; i<from->len; ++i) {
wtc 2013/04/24 22:49:45 Add spaces around operators.
+ SECStatus rv = SECITEM_CopyItem(arena,
+ &result->items[i], &from->items[i]);
+ if (rv != SECSuccess) {
+ SECITEM_ZfreeArray(result, PR_TRUE);
+ return NULL;
+ }
+ }
+
+ return result;
+}
« nss/lib/util/secitem.h ('K') | « nss/lib/util/secitem.h ('k') | nss/lib/util/secoid.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698