Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
loadext.c930 linesDownload Raw Back to src
1/*2** 2006 June 73**4** The author disclaims copyright to this source code.  In place of5** a legal notice, here is a blessing:6**7**    May you do good and not evil.8**    May you find forgiveness for yourself and forgive others.9**    May you share freely, never taking more than you give.10**11*************************************************************************12** This file contains code used to dynamically load extensions into13** the SQLite library.14*/15 16#ifndef SQLITE_CORE17  #define SQLITE_CORE 1  /* Disable the API redefinition in sqlite3ext.h */18#endif19#include "sqlite3ext.h"20#include "sqliteInt.h"21 22#ifndef SQLITE_OMIT_LOAD_EXTENSION23/*24** Some API routines are omitted when various features are25** excluded from a build of SQLite.  Substitute a NULL pointer26** for any missing APIs.27*/28#ifndef SQLITE_ENABLE_COLUMN_METADATA29# define sqlite3_column_database_name   030# define sqlite3_column_database_name16 031# define sqlite3_column_table_name      032# define sqlite3_column_table_name16    033# define sqlite3_column_origin_name     034# define sqlite3_column_origin_name16   035#endif36 37#ifdef SQLITE_OMIT_AUTHORIZATION38# define sqlite3_set_authorizer         039#endif40 41#ifdef SQLITE_OMIT_UTF1642# define sqlite3_bind_text16            043# define sqlite3_collation_needed16     044# define sqlite3_column_decltype16      045# define sqlite3_column_name16          046# define sqlite3_column_text16          047# define sqlite3_complete16             048# define sqlite3_create_collation16     049# define sqlite3_create_function16      050# define sqlite3_errmsg16               051# define sqlite3_open16                 052# define sqlite3_prepare16              053# define sqlite3_prepare16_v2           054# define sqlite3_prepare16_v3           055# define sqlite3_result_error16         056# define sqlite3_result_text16          057# define sqlite3_result_text16be        058# define sqlite3_result_text16le        059# define sqlite3_value_text16           060# define sqlite3_value_text16be         061# define sqlite3_value_text16le         062# define sqlite3_column_database_name16 063# define sqlite3_column_table_name16    064# define sqlite3_column_origin_name16   065#endif66 67#ifdef SQLITE_OMIT_COMPLETE68# define sqlite3_complete 069# define sqlite3_complete16 070#endif71 72#ifdef SQLITE_OMIT_DECLTYPE73# define sqlite3_column_decltype16      074# define sqlite3_column_decltype        075#endif76 77#ifdef SQLITE_OMIT_PROGRESS_CALLBACK78# define sqlite3_progress_handler 079#endif80 81#ifdef SQLITE_OMIT_VIRTUALTABLE82# define sqlite3_create_module 083# define sqlite3_create_module_v2 084# define sqlite3_declare_vtab 085# define sqlite3_vtab_config 086# define sqlite3_vtab_on_conflict 087# define sqlite3_vtab_collation 088#endif89 90#ifdef SQLITE_OMIT_SHARED_CACHE91# define sqlite3_enable_shared_cache 092#endif93 94#if defined(SQLITE_OMIT_TRACE) || defined(SQLITE_OMIT_DEPRECATED)95# define sqlite3_profile       096# define sqlite3_trace         097#endif98 99#ifdef SQLITE_OMIT_GET_TABLE100# define sqlite3_free_table    0101# define sqlite3_get_table     0102#endif103 104#ifdef SQLITE_OMIT_INCRBLOB105#define sqlite3_bind_zeroblob  0106#define sqlite3_blob_bytes     0107#define sqlite3_blob_close     0108#define sqlite3_blob_open      0109#define sqlite3_blob_read      0110#define sqlite3_blob_write     0111#define sqlite3_blob_reopen    0112#endif113 114#if defined(SQLITE_OMIT_TRACE)115# define sqlite3_trace_v2      0116#endif117 118/*119** The following structure contains pointers to all SQLite API routines.120** A pointer to this structure is passed into extensions when they are121** loaded so that the extension can make calls back into the SQLite122** library.123**124** When adding new APIs, add them to the bottom of this structure125** in order to preserve backwards compatibility.126**127** Extensions that use newer APIs should first call the128** sqlite3_libversion_number() to make sure that the API they129** intend to use is supported by the library.  Extensions should130** also check to make sure that the pointer to the function is131** not NULL before calling it.132*/133static const sqlite3_api_routines sqlite3Apis = {134  sqlite3_aggregate_context,135#ifndef SQLITE_OMIT_DEPRECATED136  sqlite3_aggregate_count,137#else138  0,139#endif140  sqlite3_bind_blob,141  sqlite3_bind_double,142  sqlite3_bind_int,143  sqlite3_bind_int64,144  sqlite3_bind_null,145  sqlite3_bind_parameter_count,146  sqlite3_bind_parameter_index,147  sqlite3_bind_parameter_name,148  sqlite3_bind_text,149  sqlite3_bind_text16,150  sqlite3_bind_value,151  sqlite3_busy_handler,152  sqlite3_busy_timeout,153  sqlite3_changes,154  sqlite3_close,155  sqlite3_collation_needed,156  sqlite3_collation_needed16,157  sqlite3_column_blob,158  sqlite3_column_bytes,159  sqlite3_column_bytes16,160  sqlite3_column_count,161  sqlite3_column_database_name,162  sqlite3_column_database_name16,163  sqlite3_column_decltype,164  sqlite3_column_decltype16,165  sqlite3_column_double,166  sqlite3_column_int,167  sqlite3_column_int64,168  sqlite3_column_name,169  sqlite3_column_name16,170  sqlite3_column_origin_name,171  sqlite3_column_origin_name16,172  sqlite3_column_table_name,173  sqlite3_column_table_name16,174  sqlite3_column_text,175  sqlite3_column_text16,176  sqlite3_column_type,177  sqlite3_column_value,178  sqlite3_commit_hook,179  sqlite3_complete,180  sqlite3_complete16,181  sqlite3_create_collation,182  sqlite3_create_collation16,183  sqlite3_create_function,184  sqlite3_create_function16,185  sqlite3_create_module,186  sqlite3_data_count,187  sqlite3_db_handle,188  sqlite3_declare_vtab,189  sqlite3_enable_shared_cache,190  sqlite3_errcode,191  sqlite3_errmsg,192  sqlite3_errmsg16,193  sqlite3_exec,194#ifndef SQLITE_OMIT_DEPRECATED195  sqlite3_expired,196#else197  0,198#endif199  sqlite3_finalize,200  sqlite3_free,201  sqlite3_free_table,202  sqlite3_get_autocommit,203  sqlite3_get_auxdata,204  sqlite3_get_table,205  0,     /* Was sqlite3_global_recover(), but that function is deprecated */206  sqlite3_interrupt,207  sqlite3_last_insert_rowid,208  sqlite3_libversion,209  sqlite3_libversion_number,210  sqlite3_malloc,211  sqlite3_mprintf,212  sqlite3_open,213  sqlite3_open16,214  sqlite3_prepare,215  sqlite3_prepare16,216  sqlite3_profile,217  sqlite3_progress_handler,218  sqlite3_realloc,219  sqlite3_reset,220  sqlite3_result_blob,221  sqlite3_result_double,222  sqlite3_result_error,223  sqlite3_result_error16,224  sqlite3_result_int,225  sqlite3_result_int64,226  sqlite3_result_null,227  sqlite3_result_text,228  sqlite3_result_text16,229  sqlite3_result_text16be,230  sqlite3_result_text16le,231  sqlite3_result_value,232  sqlite3_rollback_hook,233  sqlite3_set_authorizer,234  sqlite3_set_auxdata,235  sqlite3_snprintf,236  sqlite3_step,237  sqlite3_table_column_metadata,238#ifndef SQLITE_OMIT_DEPRECATED239  sqlite3_thread_cleanup,240#else241  0,242#endif243  sqlite3_total_changes,244  sqlite3_trace,245#ifndef SQLITE_OMIT_DEPRECATED246  sqlite3_transfer_bindings,247#else248  0,249#endif250  sqlite3_update_hook,251  sqlite3_user_data,252  sqlite3_value_blob,253  sqlite3_value_bytes,254  sqlite3_value_bytes16,255  sqlite3_value_double,256  sqlite3_value_int,257  sqlite3_value_int64,258  sqlite3_value_numeric_type,259  sqlite3_value_text,260  sqlite3_value_text16,261  sqlite3_value_text16be,262  sqlite3_value_text16le,263  sqlite3_value_type,264  sqlite3_vmprintf,265  /*266  ** The original API set ends here.  All extensions can call any267  ** of the APIs above provided that the pointer is not NULL.  But268  ** before calling APIs that follow, extension should check the269  ** sqlite3_libversion_number() to make sure they are dealing with270  ** a library that is new enough to support that API.271  *************************************************************************272  */273  sqlite3_overload_function,274 275  /*276  ** Added after 3.3.13277  */278  sqlite3_prepare_v2,279  sqlite3_prepare16_v2,280  sqlite3_clear_bindings,281 282  /*283  ** Added for 3.4.1284  */285  sqlite3_create_module_v2,286 287  /*288  ** Added for 3.5.0289  */290  sqlite3_bind_zeroblob,291  sqlite3_blob_bytes,292  sqlite3_blob_close,293  sqlite3_blob_open,294  sqlite3_blob_read,295  sqlite3_blob_write,296  sqlite3_create_collation_v2,297  sqlite3_file_control,298  sqlite3_memory_highwater,299  sqlite3_memory_used,300#ifdef SQLITE_MUTEX_OMIT301  0, 302  0, 303  0,304  0,305  0,306#else307  sqlite3_mutex_alloc,308  sqlite3_mutex_enter,309  sqlite3_mutex_free,310  sqlite3_mutex_leave,311  sqlite3_mutex_try,312#endif313  sqlite3_open_v2,314  sqlite3_release_memory,315  sqlite3_result_error_nomem,316  sqlite3_result_error_toobig,317  sqlite3_sleep,318  sqlite3_soft_heap_limit,319  sqlite3_vfs_find,320  sqlite3_vfs_register,321  sqlite3_vfs_unregister,322 323  /*324  ** Added for 3.5.8325  */326  sqlite3_threadsafe,327  sqlite3_result_zeroblob,328  sqlite3_result_error_code,329  sqlite3_test_control,330  sqlite3_randomness,331  sqlite3_context_db_handle,332 333  /*334  ** Added for 3.6.0335  */336  sqlite3_extended_result_codes,337  sqlite3_limit,338  sqlite3_next_stmt,339  sqlite3_sql,340  sqlite3_status,341 342  /*343  ** Added for 3.7.4344  */345  sqlite3_backup_finish,346  sqlite3_backup_init,347  sqlite3_backup_pagecount,348  sqlite3_backup_remaining,349  sqlite3_backup_step,350#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS351  sqlite3_compileoption_get,352  sqlite3_compileoption_used,353#else354  0,355  0,356#endif357  sqlite3_create_function_v2,358  sqlite3_db_config,359  sqlite3_db_mutex,360  sqlite3_db_status,361  sqlite3_extended_errcode,362  sqlite3_log,363  sqlite3_soft_heap_limit64,364  sqlite3_sourceid,365  sqlite3_stmt_status,366  sqlite3_strnicmp,367#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY368  sqlite3_unlock_notify,369#else370  0,371#endif372#ifndef SQLITE_OMIT_WAL373  sqlite3_wal_autocheckpoint,374  sqlite3_wal_checkpoint,375  sqlite3_wal_hook,376#else377  0,378  0,379  0,380#endif381  sqlite3_blob_reopen,382  sqlite3_vtab_config,383  sqlite3_vtab_on_conflict,384  sqlite3_close_v2,385  sqlite3_db_filename,386  sqlite3_db_readonly,387  sqlite3_db_release_memory,388  sqlite3_errstr,389  sqlite3_stmt_busy,390  sqlite3_stmt_readonly,391  sqlite3_stricmp,392  sqlite3_uri_boolean,393  sqlite3_uri_int64,394  sqlite3_uri_parameter,395  sqlite3_vsnprintf,396  sqlite3_wal_checkpoint_v2,397  /* Version 3.8.7 and later */398  sqlite3_auto_extension,399  sqlite3_bind_blob64,400  sqlite3_bind_text64,401  sqlite3_cancel_auto_extension,402  sqlite3_load_extension,403  sqlite3_malloc64,404  sqlite3_msize,405  sqlite3_realloc64,406  sqlite3_reset_auto_extension,407  sqlite3_result_blob64,408  sqlite3_result_text64,409  sqlite3_strglob,410  /* Version 3.8.11 and later */411  (sqlite3_value*(*)(const sqlite3_value*))sqlite3_value_dup,412  sqlite3_value_free,413  sqlite3_result_zeroblob64,414  sqlite3_bind_zeroblob64,415  /* Version 3.9.0 and later */416  sqlite3_value_subtype,417  sqlite3_result_subtype,418  /* Version 3.10.0 and later */419  sqlite3_status64,420  sqlite3_strlike,421  sqlite3_db_cacheflush,422  /* Version 3.12.0 and later */423  sqlite3_system_errno,424  /* Version 3.14.0 and later */425  sqlite3_trace_v2,426  sqlite3_expanded_sql,427  /* Version 3.18.0 and later */428  sqlite3_set_last_insert_rowid,429  /* Version 3.20.0 and later */430  sqlite3_prepare_v3,431  sqlite3_prepare16_v3,432  sqlite3_bind_pointer,433  sqlite3_result_pointer,434  sqlite3_value_pointer,435  /* Version 3.22.0 and later */436  sqlite3_vtab_nochange,437  sqlite3_value_nochange,438  sqlite3_vtab_collation,439  /* Version 3.24.0 and later */440  sqlite3_keyword_count,441  sqlite3_keyword_name,442  sqlite3_keyword_check,443  sqlite3_str_new,444  sqlite3_str_finish,445  sqlite3_str_appendf,446  sqlite3_str_vappendf,447  sqlite3_str_append,448  sqlite3_str_appendall,449  sqlite3_str_appendchar,450  sqlite3_str_reset,451  sqlite3_str_errcode,452  sqlite3_str_length,453  sqlite3_str_value,454  /* Version 3.25.0 and later */455  sqlite3_create_window_function,456  /* Version 3.26.0 and later */457#ifdef SQLITE_ENABLE_NORMALIZE458  sqlite3_normalized_sql,459#else460  0,461#endif462  /* Version 3.28.0 and later */463  sqlite3_stmt_isexplain,464  sqlite3_value_frombind,465  /* Version 3.30.0 and later */466#ifndef SQLITE_OMIT_VIRTUALTABLE467  sqlite3_drop_modules,468#else469  0,470#endif471  /* Version 3.31.0 and later */472  sqlite3_hard_heap_limit64,473  sqlite3_uri_key,474  sqlite3_filename_database,475  sqlite3_filename_journal,476  sqlite3_filename_wal,477  /* Version 3.32.0 and later */478  sqlite3_create_filename,479  sqlite3_free_filename,480  sqlite3_database_file_object,481  /* Version 3.34.0 and later */482  sqlite3_txn_state,483  /* Version 3.36.1 and later */484  sqlite3_changes64,485  sqlite3_total_changes64,486  /* Version 3.37.0 and later */487  sqlite3_autovacuum_pages,488  /* Version 3.38.0 and later */489  sqlite3_error_offset,490#ifndef SQLITE_OMIT_VIRTUALTABLE491  sqlite3_vtab_rhs_value,492  sqlite3_vtab_distinct,493  sqlite3_vtab_in,494  sqlite3_vtab_in_first,495  sqlite3_vtab_in_next,496#else497  0,498  0,499  0,500  0,501  0,502#endif503  /* Version 3.39.0 and later */504#ifndef SQLITE_OMIT_DESERIALIZE505  sqlite3_deserialize,506  sqlite3_serialize,507#else508  0,509  0,510#endif511  sqlite3_db_name,512  /* Version 3.40.0 and later */513  sqlite3_value_encoding,514  /* Version 3.41.0 and later */515  sqlite3_is_interrupted,516  /* Version 3.43.0 and later */517  sqlite3_stmt_explain,518  /* Version 3.44.0 and later */519  sqlite3_get_clientdata,520  sqlite3_set_clientdata,521  /* Version 3.50.0 and later */522  sqlite3_setlk_timeout,523  /* Version 3.51.0 and later */524  sqlite3_set_errmsg,525  sqlite3_db_status64,526  /* Version 3.52.0 and later */527  sqlite3_str_truncate,528  sqlite3_str_free529};530 531/* True if x is the directory separator character532*/533#if SQLITE_OS_WIN534# define DirSep(X)  ((X)=='/'||(X)=='\\')535#else536# define DirSep(X)  ((X)=='/')537#endif538 539/*540** Attempt to load an SQLite extension library contained in the file541** zFile.  The entry point is zProc.  zProc may be 0 in which case a542** default entry point name (sqlite3_extension_init) is used.  Use543** of the default name is recommended.544**545** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong.546**547** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with 548** error message text.  The calling function should free this memory549** by calling sqlite3DbFree(db, ).550*/551static int sqlite3LoadExtension(552  sqlite3 *db,          /* Load the extension into this database connection */553  const char *zFile,    /* Name of the shared library containing extension */554  const char *zProc,    /* Entry point.  Use "sqlite3_extension_init" if 0 */555  char **pzErrMsg       /* Put error message here if not 0 */556){557  sqlite3_vfs *pVfs = db->pVfs;558  void *handle;559  sqlite3_loadext_entry xInit;560  char *zErrmsg = 0;561  const char *zEntry;562  char *zAltEntry = 0;563  void **aHandle;564  u64 nMsg = strlen(zFile);565  int ii;566  int rc;567 568  /* Shared library endings to try if zFile cannot be loaded as written */569  static const char *azEndings[] = {570#if SQLITE_OS_WIN571     "dll"   572#elif defined(__APPLE__)573     "dylib"574#else575     "so"576#endif577  };578 579 580  if( pzErrMsg ) *pzErrMsg = 0;581 582  /* Ticket #1863.  To avoid a creating security problems for older583  ** applications that relink against newer versions of SQLite, the584  ** ability to run load_extension is turned off by default.  One585  ** must call either sqlite3_enable_load_extension(db) or586  ** sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, 0)587  ** to turn on extension loading.588  */589  if( (db->flags & SQLITE_LoadExtension)==0 ){590    if( pzErrMsg ){591      *pzErrMsg = sqlite3_mprintf("not authorized");592    }593    return SQLITE_ERROR;594  }595 596  zEntry = zProc ? zProc : "sqlite3_extension_init";597 598  /* tag-20210611-1.  Some dlopen() implementations will segfault if given599  ** an oversize filename.  Most filesystems have a pathname limit of 4K,600  ** so limit the extension filename length to about twice that.601  ** https://sqlite.org/forum/forumpost/08a0d6d9bf602  **603  ** Later (2023-03-25): Save an extra 6 bytes for the filename suffix.604  ** See https://sqlite.org/forum/forumpost/24083b579d.605  */606  if( nMsg>SQLITE_MAX_PATHLEN ) goto extension_not_found;607 608  /* Do not allow sqlite3_load_extension() to link to a copy of the609  ** running application, by passing in an empty filename. */610  if( nMsg==0 ) goto extension_not_found;611    612  handle = sqlite3OsDlOpen(pVfs, zFile);613#if SQLITE_OS_UNIX || SQLITE_OS_WIN614  for(ii=0; ii<ArraySize(azEndings) && handle==0; ii++){615    char *zAltFile = sqlite3_mprintf("%s.%s", zFile, azEndings[ii]);616    if( zAltFile==0 ) return SQLITE_NOMEM_BKPT;617    if( nMsg+strlen(azEndings[ii])+1<=SQLITE_MAX_PATHLEN ){618      handle = sqlite3OsDlOpen(pVfs, zAltFile);619    }620    sqlite3_free(zAltFile);621  }622#endif623  if( handle==0 ) goto extension_not_found;624  xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry);625 626  /* If no entry point was specified and the default legacy627  ** entry point name "sqlite3_extension_init" was not found, then628  ** construct an entry point name "sqlite3_X_init" where the X is629  ** replaced by the lowercase value of every ASCII alphabetic 630  ** character in the filename after the last "/" upto the first ".",631  ** and eliding the first three characters if they are "lib".  632  ** Examples:633  **634  **    /usr/local/lib/libExample5.4.3.so ==>  sqlite3_example_init635  **    C:/lib/mathfuncs.dll              ==>  sqlite3_mathfuncs_init636  */637  if( xInit==0 && zProc==0 ){638    int iFile, iEntry, c;639    int ncFile = sqlite3Strlen30(zFile);640    zAltEntry = sqlite3_malloc64(ncFile+30);641    if( zAltEntry==0 ){642      sqlite3OsDlClose(pVfs, handle);643      return SQLITE_NOMEM_BKPT;644    }645    memcpy(zAltEntry, "sqlite3_", 8);646    for(iFile=ncFile-1; iFile>=0 && !DirSep(zFile[iFile]); iFile--){}647    iFile++;648    if( sqlite3_strnicmp(zFile+iFile, "lib", 3)==0 ) iFile += 3;649    for(iEntry=8; (c = zFile[iFile])!=0 && c!='.'; iFile++){650      if( sqlite3Isalpha(c) ){651        zAltEntry[iEntry++] = (char)sqlite3UpperToLower[(unsigned)c];652      }653    }654    memcpy(zAltEntry+iEntry, "_init", 6);655    zEntry = zAltEntry;656    xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry);657  }658  if( xInit==0 ){659    if( pzErrMsg ){660      nMsg += strlen(zEntry) + 300;661      *pzErrMsg = zErrmsg = sqlite3_malloc64(nMsg);662      if( zErrmsg ){663        assert( nMsg<0x7fffffff );  /* zErrmsg would be NULL if not so */664        sqlite3_snprintf((int)nMsg, zErrmsg,665            "no entry point [%s] in shared library [%s]", zEntry, zFile);666        sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);667      }668    }669    sqlite3OsDlClose(pVfs, handle);670    sqlite3_free(zAltEntry);671    return SQLITE_ERROR;672  }673  sqlite3_free(zAltEntry);674  rc = xInit(db, &zErrmsg, &sqlite3Apis);675  if( rc ){676    if( rc==SQLITE_OK_LOAD_PERMANENTLY ) return SQLITE_OK;677    if( pzErrMsg ){678      *pzErrMsg = sqlite3_mprintf("error during initialization: %s", zErrmsg);679    }680    sqlite3_free(zErrmsg);681    sqlite3OsDlClose(pVfs, handle);682    return SQLITE_ERROR;683  }684 685  /* Append the new shared library handle to the db->aExtension array. */686  aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1));687  if( aHandle==0 ){688    return SQLITE_NOMEM_BKPT;689  }690  if( db->nExtension>0 ){691    memcpy(aHandle, db->aExtension, sizeof(handle)*db->nExtension);692  }693  sqlite3DbFree(db, db->aExtension);694  db->aExtension = aHandle;695 696  db->aExtension[db->nExtension++] = handle;697  return SQLITE_OK;698 699extension_not_found:700  if( pzErrMsg ){701    nMsg += 300;702    *pzErrMsg = zErrmsg = sqlite3_malloc64(nMsg);703    if( zErrmsg ){704      assert( nMsg<0x7fffffff );  /* zErrmsg would be NULL if not so */705      sqlite3_snprintf((int)nMsg, zErrmsg,706          "unable to open shared library [%.*s]", SQLITE_MAX_PATHLEN, zFile);707      sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);708    }709  }710  return SQLITE_ERROR;711}712int sqlite3_load_extension(713  sqlite3 *db,          /* Load the extension into this database connection */714  const char *zFile,    /* Name of the shared library containing extension */715  const char *zProc,    /* Entry point.  Use "sqlite3_extension_init" if 0 */716  char **pzErrMsg       /* Put error message here if not 0 */717){718  int rc;719  sqlite3_mutex_enter(db->mutex);720  rc = sqlite3LoadExtension(db, zFile, zProc, pzErrMsg);721  rc = sqlite3ApiExit(db, rc);722  sqlite3_mutex_leave(db->mutex);723  return rc;724}725 726/*727** Call this routine when the database connection is closing in order728** to clean up loaded extensions729*/730void sqlite3CloseExtensions(sqlite3 *db){731  int i;732  assert( sqlite3_mutex_held(db->mutex) );733  for(i=0; i<db->nExtension; i++){734    sqlite3OsDlClose(db->pVfs, db->aExtension[i]);735  }736  sqlite3DbFree(db, db->aExtension);737}738 739/*740** Enable or disable extension loading.  Extension loading is disabled by741** default so as not to open security holes in older applications.742*/743int sqlite3_enable_load_extension(sqlite3 *db, int onoff){744#ifdef SQLITE_ENABLE_API_ARMOR745  if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;746#endif747  sqlite3_mutex_enter(db->mutex);748  if( onoff ){749    db->flags |= SQLITE_LoadExtension|SQLITE_LoadExtFunc;750  }else{751    db->flags &= ~(u64)(SQLITE_LoadExtension|SQLITE_LoadExtFunc);752  }753  sqlite3_mutex_leave(db->mutex);754  return SQLITE_OK;755}756 757#endif /* !defined(SQLITE_OMIT_LOAD_EXTENSION) */758 759/*760** The following object holds the list of automatically loaded761** extensions.762**763** This list is shared across threads.  The SQLITE_MUTEX_STATIC_MAIN764** mutex must be held while accessing this list.765*/766typedef struct sqlite3AutoExtList sqlite3AutoExtList;767static SQLITE_WSD struct sqlite3AutoExtList {768  u32 nExt;              /* Number of entries in aExt[] */769  void (**aExt)(void);   /* Pointers to the extension init functions */770} sqlite3Autoext = { 0, 0 };771 772/* The "wsdAutoext" macro will resolve to the autoextension773** state vector.  If writable static data is unsupported on the target,774** we have to locate the state vector at run-time.  In the more common775** case where writable static data is supported, wsdStat can refer directly776** to the "sqlite3Autoext" state vector declared above.777*/778#ifdef SQLITE_OMIT_WSD779# define wsdAutoextInit \780  sqlite3AutoExtList *x = &GLOBAL(sqlite3AutoExtList,sqlite3Autoext)781# define wsdAutoext x[0]782#else783# define wsdAutoextInit784# define wsdAutoext sqlite3Autoext785#endif786 787 788/*789** Register a statically linked extension that is automatically790** loaded by every new database connection.791*/792int sqlite3_auto_extension(793  void (*xInit)(void)794){795  int rc = SQLITE_OK;796#ifdef SQLITE_ENABLE_API_ARMOR797  if( xInit==0 ) return SQLITE_MISUSE_BKPT;798#endif799#ifndef SQLITE_OMIT_AUTOINIT800  rc = sqlite3_initialize();801  if( rc ){802    return rc;803  }else804#endif805  {806    u32 i;807#if SQLITE_THREADSAFE808    sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN);809#endif810    wsdAutoextInit;811    sqlite3_mutex_enter(mutex);812    for(i=0; i<wsdAutoext.nExt; i++){813      if( wsdAutoext.aExt[i]==xInit ) break;814    }815    if( i==wsdAutoext.nExt ){816      u64 nByte = (wsdAutoext.nExt+1)*sizeof(wsdAutoext.aExt[0]);817      void (**aNew)(void);818      aNew = sqlite3_realloc64(wsdAutoext.aExt, nByte);819      if( aNew==0 ){820        rc = SQLITE_NOMEM_BKPT;821      }else{822        wsdAutoext.aExt = aNew;823        wsdAutoext.aExt[wsdAutoext.nExt] = xInit;824        wsdAutoext.nExt++;825      }826    }827    sqlite3_mutex_leave(mutex);828    assert( (rc&0xff)==rc );829    return rc;830  }831}832 833/*834** Cancel a prior call to sqlite3_auto_extension.  Remove xInit from the835** set of routines that is invoked for each new database connection, if it836** is currently on the list.  If xInit is not on the list, then this837** routine is a no-op.838**839** Return 1 if xInit was found on the list and removed.  Return 0 if xInit840** was not on the list.841*/842int sqlite3_cancel_auto_extension(843  void (*xInit)(void)844){845#if SQLITE_THREADSAFE846  sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN);847#endif848  int i;849  int n = 0;850  wsdAutoextInit;851#ifdef SQLITE_ENABLE_API_ARMOR852  if( xInit==0 ) return 0;853#endif854  sqlite3_mutex_enter(mutex);855  for(i=(int)wsdAutoext.nExt-1; i>=0; i--){856    if( wsdAutoext.aExt[i]==xInit ){857      wsdAutoext.nExt--;858      wsdAutoext.aExt[i] = wsdAutoext.aExt[wsdAutoext.nExt];859      n++;860      break;861    }862  }863  sqlite3_mutex_leave(mutex);864  return n;865}866 867/*868** Reset the automatic extension loading mechanism.869*/870void sqlite3_reset_auto_extension(void){871#ifndef SQLITE_OMIT_AUTOINIT872  if( sqlite3_initialize()==SQLITE_OK )873#endif874  {875#if SQLITE_THREADSAFE876    sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN);877#endif878    wsdAutoextInit;879    sqlite3_mutex_enter(mutex);880    sqlite3_free(wsdAutoext.aExt);881    wsdAutoext.aExt = 0;882    wsdAutoext.nExt = 0;883    sqlite3_mutex_leave(mutex);884  }885}886 887/*888** Load all automatic extensions.889**890** If anything goes wrong, set an error in the database connection.891*/892void sqlite3AutoLoadExtensions(sqlite3 *db){893  u32 i;894  int go = 1;895  int rc;896  sqlite3_loadext_entry xInit;897 898  wsdAutoextInit;899  if( wsdAutoext.nExt==0 ){900    /* Common case: early out without every having to acquire a mutex */901    return;902  }903  for(i=0; go; i++){904    char *zErrmsg;905#if SQLITE_THREADSAFE906    sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN);907#endif908#ifdef SQLITE_OMIT_LOAD_EXTENSION909    const sqlite3_api_routines *pThunk = 0;910#else911    const sqlite3_api_routines *pThunk = &sqlite3Apis;912#endif913    sqlite3_mutex_enter(mutex);914    if( i>=wsdAutoext.nExt ){915      xInit = 0;916      go = 0;917    }else{918      xInit = (sqlite3_loadext_entry)wsdAutoext.aExt[i];919    }920    sqlite3_mutex_leave(mutex);921    zErrmsg = 0;922    if( xInit && (rc = xInit(db, &zErrmsg, pThunk))!=0 ){923      sqlite3ErrorWithMsg(db, rc,924            "automatic extension loading failed: %s", zErrmsg);925      go = 0;926    }927    sqlite3_free(zErrmsg);928  }929}930