CLR SafeHandle Consideration

原创 2007年09月19日 21:07:00

CLR SafeHandle Consideration

原贴地址:
http://eparg.spaces.live.com/blog/cns!59BFC22C0E7E1A76!576.entry
原贴时间:
2006-03-01
原贴作者:
eparg

Suppose u r the dev for the FileStream, you may want to design the class as the following:
FileStream
{
IntPtr OSHandle;
void FooRead();//Calls into API and use the OSHandle;
Finalizer();//Clean resource
}
In the Finalizer, of course you should call Flush and Closehandle to release the resource.
However, u have no idea about what will happen in the FooRead function because it calls into API. For example:
FileSystem fs=new FileSystem();
fs.FooRead();
//Never use fs anymore
After FooRead goes into API, everything may happen. For example, the API may Sleep, thus the GC is safe to happen. Since the fs is not used any longer, the fs will be collected. However, it does not mean the OSHandle used in the API will be cleard to zero. Instead, the risk is that the Finalizer may be triggered, and close the handle. Since the handle is closed, the FooRead fails.

To solve the problem, u may want to change the design:
FileSystem
{
HandleObj OSHandle=new HandleObj(...);
void FooRead();//Calls into API and use the OSHandle;
Finalizer();//Clean resource
}
We wrap the handle in a class, instead of IntPtr. In the Finalizer, we call Flush only, and left the CloseHandle function in the finalizer of HandleObj class. With this design, even if the Finalizer executes during the call to FooRead, the handle is not closed. Combining with KeepAlive function in FooRead against OSHandle, problem1 is solved.
However, with this design, how can u ensure the squence of the two finalizers when both HandleObject and FileSystem ready to be collected?
...
CLR1 has to use very complex way to handle above problems, such like HandleProtector.TryAddRef... In CLR2, the Safehandle helps us to simplify the task. Since Safehandle uses critical finalizer, we can use our design2, by declaring the OSHandle as Safehandle type to solve it.

Some article mentions handle recycling attack. However, I do not think Safehandle helps much because
1) we are still able to get the int32 value by calling DangerousGetHandle.
2) handle recycling does not open a door for malicious code. malicious code comes from elsewhere. When malicious code gets in and is able to call CloseHandle, anything would happen

 
Cool article:
http://blogs.msdn.com/bclteam/archive/2005/03/16/396900.aspx

C++/CLR Windows界面编程(一·)

C++/CLR Windows界面编程前言 VS2013 创建CLR 窗口项目 CLR去除黑窗口
  • u013978977
  • u013978977
  • 2016年07月14日 16:27
  • 4632

CLR学习笔记--深入理解多态机制

一、引言 所谓万事开头难,哪怕是写一个学习笔记,以前看惯别人写的博客文章,当时看了就看了,只有一种感觉就是解决了心中的好久疑团,现在自己去写才了解,也许你看了只有短短几分钟,可别人却下了功夫,用了很多...
  • u011964267
  • u011964267
  • 2013年09月05日 17:14
  • 1271

C++/CLR 概念原理

一、CLI简介   CLI:(Common Language Infrastructure,通用语言框架)提供了一套可执行代码和它所运行需要的虚拟执行环境的规范。更通俗的我们可以说它是一个虚拟平台,是...
  • zxxSsdsd
  • zxxSsdsd
  • 2013年07月16日 15:14
  • 1398

编译和部署CLR程序集

SQL Server CLR集成,让我们可以用C#编程,实现我们熟知的存储过程、函数及触发器等,然后部署到SQL Server。部署完成后,又可以用我们熟知的方式来调用。SQL Server CLR是...
  • Burgess_Liu
  • Burgess_Liu
  • 2013年08月22日 10:22
  • 3260

.NET, ASP.NET, CLR版本问题总结

有时候查.NET相关资料的时候,会遇到很多版本数字,比如说.net版本,asp.net版本等。一直对这些版本的对应特别模糊,这里做一个总结。   .NET是由Compiler编译器,System....
  • sundacheng1989
  • sundacheng1989
  • 2015年11月04日 12:37
  • 894

关于CLR、CIL、CTS、CLS、CLI、BCL和FCL

原文地址:点击打开链接如果要想深入学习.NET平台,那么标题中的这些关键字对你来说并不陌生,这些名词构成了.NET庞大的生态系统,为了宏观认识.NET平台,学些.NET架构体系,针对一些常用常用名词的...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2015年12月01日 21:06
  • 1252

C++通过CLR调用C#dll--如何定义合适的参数

C++调用C#的dll的时候,如何正确的定义C#函数是一个问题,本文将告诉你如何解决这个问题...
  • benbencoco
  • benbencoco
  • 2014年03月04日 15:53
  • 1425

SQL Server实现CLR步骤及其需要配置注意的问题(转)

介绍 我们一起来做个示例,在.NET中新建一个类,并在这个类里新建一个方法,然后在SQL Server中调用这个方法。按照微软所述,通过宿主 Microsoft .NET Framework 2....
  • ljh56789
  • ljh56789
  • 2014年08月06日 09:12
  • 4895

CLR 中未处理异常的处置

CLR 全面透彻解析 CLR 中未处理异常的处置 Gaurav Khanna 请注意,尽管在本文的打印版本中引用了相关代码,但并没有代码可供下载。   目录 ...
  • sgzwiz
  • sgzwiz
  • 2014年11月10日 14:34
  • 1642

《CLR via C#》学习笔记【1】

一、CLR的执行模块1.1 将源代码编译成托管模块 非托管C/C++可对系统进行低级控制,按自己的想法管理内存、VB可以快速生成UI应用程序,并控制COM对象和数据库。 公共语言运行时(Commo...
  • just0kk
  • just0kk
  • 2016年05月05日 20:11
  • 1284
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CLR SafeHandle Consideration
举报原因:
原因补充:

(最多只允许输入30个字)