OLD | NEW |
1 /* This Source Code Form is subject to the terms of the Mozilla Public | 1 /* This Source Code Form is subject to the terms of the Mozilla Public |
2 * License, v. 2.0. If a copy of the MPL was not distributed with this | 2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4 | 4 |
5 /* | 5 /* |
6 * Support routines for SECItem data structure. | 6 * Support routines for SECItem data structure. |
7 * | 7 * |
8 * $Id: secitem.c,v 1.18 2012/04/25 14:50:16 gerv%gerv.net Exp $ | 8 * $Id$ |
9 */ | 9 */ |
10 | 10 |
11 #include "seccomon.h" | 11 #include "seccomon.h" |
12 #include "secitem.h" | 12 #include "secitem.h" |
13 #include "base64.h" | 13 #include "base64.h" |
14 #include "secerr.h" | 14 #include "secerr.h" |
| 15 #include "secport.h" |
15 | 16 |
16 SECItem * | 17 SECItem * |
17 SECITEM_AllocItem(PRArenaPool *arena, SECItem *item, unsigned int len) | 18 SECITEM_AllocItem(PRArenaPool *arena, SECItem *item, unsigned int len) |
18 { | 19 { |
19 SECItem *result = NULL; | 20 SECItem *result = NULL; |
20 void *mark = NULL; | 21 void *mark = NULL; |
21 | 22 |
22 if (arena != NULL) { | 23 if (arena != NULL) { |
23 mark = PORT_ArenaMark(arena); | 24 mark = PORT_ArenaMark(arena); |
24 } | 25 } |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 * but heck it's only used internally by the hash table anyway. | 288 * but heck it's only used internally by the hash table anyway. |
288 */ | 289 */ |
289 PRIntn PR_CALLBACK | 290 PRIntn PR_CALLBACK |
290 SECITEM_HashCompare ( const void *k1, const void *k2) | 291 SECITEM_HashCompare ( const void *k1, const void *k2) |
291 { | 292 { |
292 const SECItem *i1 = (const SECItem *)k1; | 293 const SECItem *i1 = (const SECItem *)k1; |
293 const SECItem *i2 = (const SECItem *)k2; | 294 const SECItem *i2 = (const SECItem *)k2; |
294 | 295 |
295 return SECITEM_ItemsAreEqual(i1,i2); | 296 return SECITEM_ItemsAreEqual(i1,i2); |
296 } | 297 } |
| 298 |
| 299 SECItemArray * |
| 300 SECITEM_AllocArray(PLArenaPool *arena, SECItemArray *array, unsigned int len) |
| 301 { |
| 302 SECItemArray *result = NULL; |
| 303 void *mark = NULL; |
| 304 |
| 305 if (arena != NULL) { |
| 306 mark = PORT_ArenaMark(arena); |
| 307 } |
| 308 |
| 309 if (array == NULL) { |
| 310 if (arena != NULL) { |
| 311 result = PORT_ArenaZAlloc(arena, sizeof(SECItemArray)); |
| 312 } else { |
| 313 result = PORT_ZAlloc(sizeof(SECItemArray)); |
| 314 } |
| 315 if (result == NULL) { |
| 316 goto loser; |
| 317 } |
| 318 } else { |
| 319 PORT_Assert(array->items == NULL); |
| 320 result = array; |
| 321 } |
| 322 |
| 323 result->len = len; |
| 324 if (len) { |
| 325 if (arena != NULL) { |
| 326 result->items = PORT_ArenaZNewArray(arena, SECItem, len); |
| 327 } else { |
| 328 result->items = PORT_ZNewArray(SECItem, len); |
| 329 } |
| 330 if (result->items == NULL) { |
| 331 goto loser; |
| 332 } |
| 333 } else { |
| 334 result->items = NULL; |
| 335 } |
| 336 |
| 337 if (mark) { |
| 338 PORT_ArenaUnmark(arena, mark); |
| 339 } |
| 340 return(result); |
| 341 |
| 342 loser: |
| 343 if ( arena != NULL ) { |
| 344 if (mark) { |
| 345 PORT_ArenaRelease(arena, mark); |
| 346 } |
| 347 if (array != NULL) { |
| 348 array->items = NULL; |
| 349 array->len = 0; |
| 350 } |
| 351 } else { |
| 352 if (result != NULL && array == NULL) { |
| 353 PORT_Free(result); |
| 354 } |
| 355 /* |
| 356 * If array is not NULL, the above has set array->data and |
| 357 * array->len to 0. |
| 358 */ |
| 359 } |
| 360 return(NULL); |
| 361 } |
| 362 |
| 363 void secitem_FreeArray(SECItemArray *array, PRBool zero_items, PRBool freeit) |
| 364 { |
| 365 unsigned int i; |
| 366 |
| 367 if (!array || !array->len || !array->items) |
| 368 return; |
| 369 |
| 370 for (i=0; i<array->len; ++i) { |
| 371 SECItem *item = &array->items[i]; |
| 372 |
| 373 if (item->data) { |
| 374 if (zero_items) { |
| 375 SECITEM_ZfreeItem(item, PR_FALSE); |
| 376 } else { |
| 377 SECITEM_FreeItem(item, PR_FALSE); |
| 378 } |
| 379 } |
| 380 } |
| 381 |
| 382 if (freeit) |
| 383 PORT_Free(array); |
| 384 } |
| 385 |
| 386 void SECITEM_FreeArray(SECItemArray *array, PRBool freeit) |
| 387 { |
| 388 secitem_FreeArray(array, PR_FALSE, freeit); |
| 389 } |
| 390 |
| 391 void SECITEM_ZfreeArray(SECItemArray *array, PRBool freeit) |
| 392 { |
| 393 secitem_FreeArray(array, PR_TRUE, freeit); |
| 394 } |
| 395 |
| 396 SECItemArray * |
| 397 SECITEM_DupArray(PLArenaPool *arena, const SECItemArray *from) |
| 398 { |
| 399 SECItemArray *result; |
| 400 unsigned int i; |
| 401 |
| 402 if (!from || !from->items || !from->len) |
| 403 return NULL; |
| 404 |
| 405 result = SECITEM_AllocArray(arena, NULL, from->len); |
| 406 if (!result) |
| 407 return NULL; |
| 408 |
| 409 for (i=0; i<from->len; ++i) { |
| 410 SECStatus rv = SECITEM_CopyItem(arena, |
| 411 &result->items[i], &from->items[i]); |
| 412 if (rv != SECSuccess) { |
| 413 SECITEM_ZfreeArray(result, PR_TRUE); |
| 414 return NULL; |
| 415 } |
| 416 } |
| 417 |
| 418 return result; |
| 419 } |
OLD | NEW |