Logo Search packages:      
Sourcecode: g2ipmsg version File versions  Download package

static int open_key_file_for_write ( int *  fd_p,
const unsigned char *  file 
) [static]

RSA鍵を格納したファイルを書き込み用に開く

Parameters:
[out] fd_p 開いたファイルを操作するためのファイル記述子格納領域のアドレス
[in] file RSA鍵ファイルのファイル名
Return values:
0 正常終了
-EINVAL 引数異常(fd_pまたはfileがNULLである).
-EPERM 以下のいずれかが発生した.
  • ファイルに対するアクセス権がない
  • rootが所有するファイルである,
  • 自身が所有するファイルでない.
  • シンボリックリンクである
Attention:
内部リンケージ

Definition at line 208 of file pubcrypt.c.

References file_check_mutex.

Referenced by store_private_key(), and store_public_key().

                                                              {
      int    rc = 0;
      int    fd = 0;
      uid_t uid = 0;
      struct stat fbuff,lbuff;


      if ( (fd_p == NULL) || (file == NULL) )
            return -EINVAL;

      g_static_mutex_lock(&file_check_mutex); /* 厳密にいえば不要 */

      fd = open(file, O_CREAT|O_EXCL|O_WRONLY, S_IRUSR|S_IWUSR);

      if (fd < 0){
            if (errno != EEXIST) {
                  rc = -errno;
                  goto unlock_out;
            } else {
                  fd = open(file, O_WRONLY);
                  if (fd < 0){
                        rc = -errno;
                        goto unlock_out;
                  }
            }
      }

      rc = fstat(fd, &fbuff);
      if (rc < 0) {
            rc = -errno;
            goto error_out;
      }

      rc = lstat(file, &lbuff);
      if (rc < 0) {
            rc = -errno;
            goto error_out;
      }

      uid = geteuid();

      /*
       * 偏執的ではあるが, リンクでないことを確認する
       */
      rc = -EPERM;
      if ( (lbuff.st_mode != fbuff.st_mode) ||
          (lbuff.st_ino != fbuff.st_ino) ||
          (lbuff.st_dev != fbuff.st_dev) )
            goto error_out;
      /*
       * 本人以外に書き込めないことを確認する
       */
      if ( ((fbuff.st_mode) & RSA_DIR_INVALID_FLAGS))
            goto error_out;
      /*
       * rootが所有するファイルには, 書き込まない
       */
      
      if ( (fbuff.st_uid == 0) ||
          ( (fbuff.st_uid > 0) && (fbuff.st_uid != uid) ) )
            goto error_out;

      rc = 0;
      *fd_p = fd;

unlock_out:
      g_static_mutex_unlock(&file_check_mutex); /* 厳密にいえば不要 */
      return rc;

error_out:
      close(fd);
      g_static_mutex_unlock(&file_check_mutex); /* 厳密にいえば不要 */

  return rc;
}


Generated by  Doxygen 1.6.0   Back to index