if( (void *)NULL == (void *)fwObject->mdObject->GetAttributeSize ) {
if( (void *)NULL == (void *)fwObject->mdObject->GetAttribute ) {
nssCKFWObject_GetAttribute(  NSSCKFWObject *fwObject,  CK_ATTRIBUTE_TYPE attribute,  NSSItem *itemOpt,  NSSArena *arenaOpt,  CK_RV *pError){  NSSItem *rv = (NSSItem *)NULL;  const NSSItem *mdItem;#ifdef NSSDEBUG  if( (CK_RV *)NULL == pError ) {    return (NSSItem *)NULL;  }  *pError = nssCKFWObject_verifyPointer(fwObject);  if( CKR_OK != *pError ) {    return (NSSItem *)NULL;  }#endif /* NSSDEBUG */  if( (void *)NULL == (void *)fwObject->mdObject->GetAttributeSize ) {    *pError = CKR_GENERAL_ERROR;    return (NSSItem *)NULL;  }  *pError = nssCKFWMutex_Lock(fwObject->mutex);  if( CKR_OK != *pError ) {    return (NSSItem *)NULL;  }  mdItem = fwObject->mdObject->GetAttribute(fwObject->mdObject, fwObject,    fwObject->mdSession, fwObject->fwSession, fwObject->mdToken,     fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance,    attribute, pError);  if( (NSSItem *)NULL == mdItem ) {    if( CKR_OK == *pError ) {      *pError = CKR_GENERAL_ERROR;    }    goto done;  }  if( (NSSItem *)NULL == itemOpt ) {    rv = nss_ZNEW(arenaOpt, NSSItem);    if( (NSSItem *)NULL == rv ) {      *pError = CKR_HOST_MEMORY;      goto done;    }  } else {    rv = itemOpt;  }  if( (void *)NULL == rv->data ) {    rv->size = mdItem->size;    rv->data = nss_ZAlloc(arenaOpt, rv->size);    if( (void *)NULL == rv->data ) {      *pError = CKR_HOST_MEMORY;      if( (NSSItem *)NULL == itemOpt ) {        nss_ZFreeIf(rv);      }      rv = (NSSItem *)NULL;      goto done;    }  } else {    if( rv->size >= mdItem->size ) {      rv->size = mdItem->size;    } else {      *pError = CKR_BUFFER_TOO_SMALL;      /* Should we set rv->size to mdItem->size? */      /* rv can't have been allocated */      rv = (NSSItem *)NULL;      goto done;    }  }  (void)nsslibc_memcpy(rv->data, mdItem->data, rv->size); done:  (void)nssCKFWMutex_Unlock(fwObject->mutex);  return rv;}