2012-03-11 2 views
0

はここでGNUのCoreutils内のlib/xreadlink.cファイルからのコードの一部です..私は理解できませんでし以外シンボリックリンクファイル内のリンクのサイズが大きすぎるかどうかをチェックする条件は、このコードでどのように機能しますか?

/* Call readlink to get the symbolic link value of FILENAME. 
    + SIZE is a hint as to how long the link is expected to be; 
    + typically it is taken from st_size. It need not be correct. 
     Return a pointer to that NUL-terminated string in malloc'd storage. 
     If readlink fails, return NULL (caller may use errno to diagnose). 
     If malloc fails, or if the link value is longer than SSIZE_MAX :-), 
     give a diagnostic and exit. */ 

char * xreadlink (char const *filename) 
{ 
    /* The initial buffer size for the link value. A power of 2 
     detects arithmetic overflow earlier, but is not required. */ 
    size_t buf_size = 128; 

    while (1) 
    { 
     char* buffer = xmalloc(buf_size); 
     ssize_t link_length = readlink(filename, buffer, buf_size); 
     if(link_length < 0) 
     { 
     /*handle failure of system call*/ 
     } 

     if((size_t) link_length < buf_size) 
     { 
      buffer[link_length] = 0; 
      return buffer; 
     } 

     /*size not sufficient, allocate more*/ 
     free (buffer); 
     buf_size *= 2; 
     /*Check whether increase is possible*/ 
     if (SSIZE_MAX < buf_size || (SIZE_MAX/2 < SSIZE_MAX && buf_size == 0)) 
      xalloc_die(); 
    } 
} 

コードは理解できるがどのようにリンクのサイズが大きすぎる作品であるかどうかのチェック、どのように

 (SIZE_MAX/2 < SSIZE_MAX) 

条件は、任意のシステム上で真であることができ、また、

 if (SSIZE_MAX < buf_size || (SIZE_MAX/2 < SSIZE_MAX && buf_size == 0)) 

???:それはラインであります

答えて

1

SSIZE_MAXは、size_tの符号付き種類の最大値です。たとえば、size_tが16ビットのみ(おそらくほとんどありません)の場合、SIZE_MAXは65535ですが、ssize_maxは32767です。32ビット(それぞれ4294967295と2147483647)または64ビット - ))。

ここに解決するための基本的な問題はbuf_sizeSSIZE_MAXを超えると大きな正の値がマイナスになりますよう、リンクを読み取ることは不可能ですのでreadlinkが... SIZE_MAXは符号なしの1であっても符号付きの値を返すということです戻り値

「さらに」の部分については、あなたが正しいとは言えません。とにかく、どんなに普通のシステムでも、少なくとも。 (理論的には、たとえば、32ビットのSIZE_MAXを持つことは可能ですが、SSIZE_MAXも4294967295になるように33ビットの符号付き整数を持つことが可能です。このコードは理論上は可能ですが実際には見られないシステムを防ぐために書かれています。 )

関連する問題