偶发odbc.ini文件被清空

现象:某个现场 odbc.ini 莫名其妙被清空,偶发情况,大概几周出现一次。

unixodbc官网地址–> https://www.unixodbc.org/

在这里插入图片描述

//2.3.7
BOOL _odbcinst_SystemINI( char *pszFileName, BOOL bVerify )
{
    FILE            *hFile;
    char            b1[ ODBC_FILENAME_MAX + 1 ];
 
    sprintf( pszFileName, "%s/odbc.ini", odbcinst_system_file_path( b1 ));
     
    if ( bVerify )
    {
        /* try opening for read */
        hFile = uo_fopen( pszFileName, "r" );
        if ( hFile )
            uo_fclose( hFile );
        else
        {    	
        	//可能是文件描述符到上限了或者其它情况导致打开失败,并不是文件真的不存在,没有做这些场景的处理
        	//比如服务以普通用户运行,进程打开文件描述符上限为4096。
			//此时进程打开文件描述符已经达到上限会出现以下情况
			//第一个if判断时 超过打开上限 uo_fopen失败而进入else分支判断 此时如果进程释放了几个句柄 进程打开的文件描述数量小于4096了 再次uo_fopen成功了
			//然后这里以w方式uo_fopen(底层封装的是系统的open函数)文件会清空odbc.ini
            /* does not exist so try creating it */
            hFile = uo_fopen( pszFileName, "w" );
            if ( hFile )
                uo_fclose( hFile );
            else
                return FALSE;
        }
    }
 
    return TRUE;
}
//odbc官网2.3.8版本说明修复了2.3.7的bug对文件打开失败产生的错误码进行了判断
//没能下载到2.3.8的代码 此处代码为2.3.11
BOOL _odbcinst_SystemINI( char *pszFileName, BOOL bVerify )
{
    FILE            *hFile;
    char            b1[ ODBC_FILENAME_MAX + 1 ];
 
    sprintf( pszFileName, "%s/odbc.ini", odbcinst_system_file_path( b1 ));
 
    if ( bVerify )
    {
        /* try opening for read */
        hFile = uo_fopen( pszFileName, "r" );
        if ( hFile )
        {
            uo_fclose( hFile );
        }
        else
        {
            if ( ( !hFile ) &&
                ( errno != ENFILE ) && ( errno != EMFILE ) &&
                ( errno != ENOMEM ) && ( errno != EACCES ) && 
                ( errno != EFBIG ) && ( errno != EINTR ) &&
                ( errno != ENOSPC ) && ( errno != EOVERFLOW ) &&
                ( errno != EWOULDBLOCK ))
            {
                return FALSE;
            }
 
            /* does not exist so try creating it */
            hFile = uo_fopen( pszFileName, "w" );
            if ( hFile )
                uo_fclose( hFile );
            else
                return FALSE;
        }
    }
 
    return TRUE;
}

对比下不同版本的代码还是很明显的能看出问题所在

我们的思路是:
1 排查用到了linux的监控服务 audit配置规则自行百度 发现我们的模块修改odbc.ini文件
2 排查了自己服务和链接的静态库的所有代码没有操作odbc.ini的代码,转而怀疑系统的odbc库
3 去odbc官网查看修复信息。下载相应版本代码查看关键字 “odbc.ini” 发现了此处的代码
4 官方在2.3.8已经修复了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Minio是一个开源的对象存储服务器,它提供了类似于Amazon S3的API接口。关于Minio权限被更改的问题,可以通过以下步骤来解决: 1. 检查Minio依赖:确保你的项目中已经正确添加了Minio的依赖项。你可以在项目的pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.4.0</version> </dependency> ``` 2. 检查Minio服务启动脚本:确保你的Minio服务已经正确启动,并且使用了正确的端口和路径。你可以使用以下命令启动Minio服务: ```shell ./minio server --address :9966 --console-address :9967 /usr/local/minio/data/minio ``` 其中,9966是Minio服务的API端口,9967是Minio服务的管理平台端口。 3. 检查文件Md5接口:如果你的Minio权限偶发性被更改,你可以检查文件Md5接口是否正确设置。你可以使用Minio提供的API来获取文件的MD5值,以确保文件的完整性。以下是一个示例代码: ```java import io.minio.MinioClient; import io.minio.errors.MinioException; public class MinioExample { public static void main(String[] args) { try { // 初始化Minio客户端 MinioClient minioClient = new MinioClient("http://localhost:9966", "accessKey", "secretKey"); // 获取文件的MD5值 String bucketName = "mybucket"; String objectName = "myobject"; String md5 = minioClient.getObjectMd5(bucketName, objectName); System.out.println("MD5 value of the file: " + md5); } catch (MinioException e) { System.out.println("Error occurred: " + e.getMessage()); } } } ``` 通过以上步骤,你可以检查Minio的依赖、启动脚本和文件Md5接口,以解决Minio权限偶发性被更改的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值