reject = PR_NEW(si_Reject);
si_PutReject(char * URLName, char * userName, PRBool save) {  si_Reject * reject;  char * URLName2=NULL;  char * userName2=NULL;  reject = PR_NEW(si_Reject);  if (reject) {    /*     * lock the signon list     *  Note that, for efficiency, SI_LoadSignonData already sets the lock     *  before calling this routine whereas none of the other callers do.     *  So we need to determine whether or not we were called from     *  SI_LoadSignonData before setting or clearing the lock.  We can     *  determine this by testing "save" since only SI_LoadSignonData     *  passes in a value of PR_FALSE for "save".     */    if (save) {      si_lock_signon_list();    }    StrAllocCopy(URLName2, URLName);    StrAllocCopy(userName2, userName);    reject->URLName = URLName2;    reject->userName = userName2;    if(!si_reject_list) {      si_reject_list = new nsVoidArray();      if(!si_reject_list) {        PR_Free(reject->URLName);        PR_Free(reject->userName);        PR_Free(reject);        if (save) {          si_unlock_signon_list();        }        return;      }    }#ifdef alphabetize    /* add it to the list in alphabetical order */    si_Reject * tmp_reject;    PRBool rejectAdded = PR_FALSE;    PRInt32 rejectCount = LIST_COUNT(si_reject_list);    for (PRInt32 i = 0; i<rejectCount; ++i) {      tmp_reject = NS_STATIC_CAST(si_Reject *, si_reject_list->ElementAt(i));      if (tmp_reject) {        if (PL_strcasecmp(reject->URLName, tmp_reject->URLName)<0) {          si_reject_list->InsertElementAt(reject, i);          rejectAdded = PR_TRUE;          break;        }      }    }    if (!rejectAdded) {      si_reject_list->AppendElement(reject);    }#else    /* add it to the end of the list */    si_reject_list->AppendElement(reject);#endif    if (save) {      si_signon_list_changed = PR_TRUE;      si_lock_signon_list();      si_SaveSignonDataLocked(PR_FALSE);      si_unlock_signon_list();    }    if (save) {      si_unlock_signon_list();    }  }}