oracle 19c failed to SQLAllocEnv and segment fault

38 Views Asked by At

compile : shell/ gcc -o test test.c -ldl -lodbc

#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <sql.h>
#include <sqlext.h>

int main() {
    void* oracleLib = dlopen("libsqora.so.19.1", RTLD_NOW);

    if (!oracleLib) {
        fprintf(stderr, "failed open Oracle ODBC library: %s\n", dlerror());
        return 1;
    }

    SQLHENV hEnv;
    SQLRETURN (*SQLAllocHandle)(SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE *OutputHandle);
    SQLRETURN (*SQLSetEnvAttr)(SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength);
    //SQLRETURN (*SQLAllocConnect)(SQLHENV EnvironmentHandle, SQLHDBC *ConnectionHandle);
    SQLRETURN (*SQLDriverConnectW)(SQLHDBC ConnectionHandle, SQLHWND WindowHandle, SQLCHAR *InConnectionString,
                                  SQLSMALLINT StringLength1, SQLCHAR *OutConnectionString, SQLSMALLINT BufferLength,
                                  SQLSMALLINT *StringLength2Ptr, SQLUSMALLINT DriverCompletion);
    SQLRETURN (*SQLFreeHandle)(SQLSMALLINT HandleType, SQLHANDLE Handle);

    SQLAllocHandle = dlsym(oracleLib, "SQLAllocHandle");
    SQLSetEnvAttr = dlsym(oracleLib, "SQLSetEnvAttr");
    //SQLAllocConnect = dlsym(oracleLib, "SQLAllocConnect");
    SQLDriverConnectW = dlsym(oracleLib, "SQLDriverConnectW");
    SQLFreeHandle = dlsym(oracleLib, "SQLFreeHandle");

    if (!SQLAllocHandle || !SQLSetEnvAttr || !SQLAllocConnect || !SQLDriverConnectW || !SQLFreeHandle) {
        fprintf(stderr, "can not find ODBC API: %s\n", dlerror());
        dlclose(oracleLib);
        return 1;
    }

    SQLRETURN sReturn;

    sReturn = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
    if(sReturn < 0 )
    {
        fprintf(stderr, "%d SQLAllocHandle failed\n", __LINE__ );
        dlclose(oracleLib);
        return -1;
    }
    
    sReturn = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
    if(sReturn < 0 )
    {
        fprintf(stderr, "%d SQLSetEnvAttr failed\n", __LINE__ );
        dlclose(oracleLib);
        return -1;
    }


    SQLHDBC hDbc;
    sReturn = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);


    sReturn = SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
    sReturn = SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
    dlclose(oracleLib);

    return 0;
}

This is an example program that dynamically opens the oracle library and allocates SQLHENV.

It is operating normally in the account where Oracle is installed, but in other accounts, SQLHENV allocation fails and a segmentation fault occurs during the dlclose process.

I also checked the library permissions.

shell/ ldd libsqora.so.19.1 
linux-vdso.so.1 =>  (0x00007fff713f2000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fce7feca000)
libm.so.6 => /lib64/libm.so.6 (0x00007fce7fbc8000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fce7f9ac000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fce7f792000)
librt.so.1 => /lib64/librt.so.1 (0x00007fce7f58a000)
libaio.so.1 => /lib64/libaio.so.1 (0x00007fce7f388000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fce7f16e000)
libclntsh.so.19.1 => /home/lkh/workspace/libclntsh.so.19.1 (0x00007fce7b160000)
libclntshcore.so.19.1 => /home/lkh/workspace/libclntshcore.so.19.1 (0x00007fce7abc0000)
libodbcinst.so.2 => /lib64/libodbcinst.so.2 (0x00007fce7a9ae000)
libc.so.6 => /lib64/libc.so.6 (0x00007fce7a5e0000)
/lib64/ld-linux-x86-64.so.2 (0x00007fce80388000)
libnnz19.so => /home/oracle/oracle/lib/libnnz19.so (0x00007fce79e98000)
libltdl.so.7 => /lib64/libltdl.so.7 (0x00007fce79c8e000)

What did I miss?

0

There are 0 best solutions below