Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Improve the sqlite3_result_pointer() interface so that it cannot be faked using sqlite3_result_null() and sqlite3_result_subtype(). |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | pointer-types |
Files: | files | file ages | folders |
SHA3-256: |
c13264d5ef0470fb24e09f7bc12f19be |
User & Date: | drh 2017-07-17 11:39:46.366 |
Context
2017-07-17
| ||
12:27 | Add the pointer-type parameter to sqlite3_bind_pointer(), sqlite3_result_pointer(), and sqlite3_value_pointer(). The pointer type is a static string that must match (according to strcmp()) or else the pointer is passed as a NULL. This is a security measure to prevent crossing pointers between different extensions. (check-in: e1196567fc user: drh tags: branch-3.20) | |
11:39 | Improve the sqlite3_result_pointer() interface so that it cannot be faked using sqlite3_result_null() and sqlite3_result_subtype(). (Closed-Leaf check-in: c13264d5ef user: drh tags: pointer-types) | |
00:40 | Add an experimental "pointer type" parameter to sqlite3_bind_pointer(), sqlite3_result_pointer(), and sqlite3_value_pointer(). The pointer type is a string that must compare equal using strcmp() or else the pointer comes through as a NULL. (check-in: 211cce04e9 user: drh tags: pointer-types) | |
Changes
Changes to src/vdbeapi.c.
︙ | ︙ | |||
197 198 199 200 201 202 203 | } unsigned int sqlite3_value_subtype(sqlite3_value *pVal){ Mem *pMem = (Mem*)pVal; return ((pMem->flags & MEM_Subtype) ? pMem->eSubtype : 0); } void *sqlite3_value_pointer(sqlite3_value *pVal, const char *zPType){ Mem *p = (Mem*)pVal; | | | 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 | } unsigned int sqlite3_value_subtype(sqlite3_value *pVal){ Mem *pMem = (Mem*)pVal; return ((pMem->flags & MEM_Subtype) ? pMem->eSubtype : 0); } void *sqlite3_value_pointer(sqlite3_value *pVal, const char *zPType){ Mem *p = (Mem*)pVal; if( p->flags==(MEM_Null|MEM_Subtype|MEM_Term|MEM_Static) && p->eSubtype=='p' && zPType!=0 && strcmp(p->z, zPType)==0 ){ return p->u.pPtr; }else{ return 0; |
︙ | ︙ |
Changes to src/vdbemem.c.
︙ | ︙ | |||
708 709 710 711 712 713 714 | /* ** Set the value stored in *pMem should already be a NULL. ** Also store a pointer to go with it. */ void sqlite3VdbeMemSetPointer(Mem *pMem, void *pPtr, const char *zPType){ assert( pMem->flags==MEM_Null ); if( zPType ){ | | | 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 | /* ** Set the value stored in *pMem should already be a NULL. ** Also store a pointer to go with it. */ void sqlite3VdbeMemSetPointer(Mem *pMem, void *pPtr, const char *zPType){ assert( pMem->flags==MEM_Null ); if( zPType ){ pMem->flags = MEM_Null|MEM_Subtype|MEM_Term|MEM_Static; pMem->u.pPtr = pPtr; pMem->eSubtype = 'p'; pMem->z = (char*)zPType; } } #ifndef SQLITE_OMIT_FLOATING_POINT |
︙ | ︙ |