[#50466] [ruby-trunk - Bug #7492][Open] Segmentation fault at DL::TestDL#test_call_double on x64 Windows 8 — "phasis68 (Heesob Park)" <phasis@...>

23 messages 2012/12/02

[#50558] [ruby-trunk - Feature #7511][Open] short-circuiting logical implication operator — "rits (First Last)" <redmine@...>

12 messages 2012/12/04

[#50575] [ruby-trunk - Feature #7517][Open] Fixnum::MIN,MAX — "matz (Yukihiro Matsumoto)" <matz@...>

20 messages 2012/12/05

[#50755] Becoming a committer — Charlie Somerville <charlie@...>

Hi ruby-core,

21 messages 2012/12/11
[#50759] Re: Becoming a committer — Yukihiro Matsumoto <matz@...> 2012/12/11

Hi,

[#50784] Re: Becoming a committer — Charles Oliver Nutter <headius@...> 2012/12/11

It's really this easy? If so, I'll send over my public key today :)

[#50795] Re: Becoming a committer — Yukihiro Matsumoto <matz@...> 2012/12/11

Hi,

[#50806] [ruby-trunk - Feature #7548][Open] Load and Require Callbacks — "trans (Thomas Sawyer)" <transfire@...>

12 messages 2012/12/12

[#50810] [ruby-trunk - Feature #7549][Open] A Ruby Design Process — "brixen (Brian Ford)" <brixen@...>

34 messages 2012/12/12

[#50867] [ruby-trunk - Bug #7556][Assigned] test error on refinement — "usa (Usaku NAKAMURA)" <usa@...>

14 messages 2012/12/13

[#50900] [ruby-trunk - Bug #7564][Open] r38175 introduces incompatibility — "tenderlovemaking (Aaron Patterson)" <aaron@...>

14 messages 2012/12/14

[#50951] [ruby-trunk - Bug #7584][Open] Ruby hangs when shutting down an ssl connection in gc finalization — "bpot (Bob Potter)" <bobby.potter@...>

12 messages 2012/12/17

[#51076] [ruby-trunk - Feature #7604][Open] Make === comparison operator ability to delegate comparison to an argument — "prijutme4ty (Ilya Vorontsov)" <prijutme4ty@...>

12 messages 2012/12/22

[#51170] [ruby-trunk - Bug #7629][Open] Segmentation fault — "atd (Antonio Tapiador)" <atapiador@...>

13 messages 2012/12/28

[ruby-core:50709] [ruby-trunk - Feature #7525][Assigned] How to avoid memory leak when something gets wrong and throw exception when using win32api?

From: "mame (Yusuke Endoh)" <mame@...>
Date: 2012-12-09 12:11:48 UTC
List: ruby-core #50709
Issue #7525 has been updated by mame (Yusuke Endoh).

Status changed from Open to Assigned
Assignee set to usa (Usaku NAKAMURA)
Target version set to 2.0.0

Is this really a feature request?  Or bug report?

Assigning to usa.
Usa-san, if this is a feature, please set the target to next minor.
If this is a bug report, please consider how to fix.

-- 
Yusuke Endoh <mame@tsg.ne.jp>
----------------------------------------
Feature #7525: How to avoid memory leak when something gets wrong and throw exception when using win32api?
https://bugs.ruby-lang.org/issues/7525#change-34554

Author: mghomn (Justin Peal)
Status: Assigned
Priority: Normal
Assignee: usa (Usaku NAKAMURA)
Category: 
Target version: 2.0.0


require 'win32api'

module Crypto
  # Common API
  NULL = 0
  @GetLastError = Win32API.new('kernel32', 'GetLastError', '', 'I')
  @lstrlen = Win32API.new('kernel32', 'lstrlenW', 'L', 'I')

  # Memory API
  @RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'PLL', 'I')
  @LocalFree = Win32API.new('kernel32', 'LocalFree', 'L', 'I')

  # Crypto API
  CRYPTPROTECT_UI_FORBIDDEN = 0x01
  @CryptProtectData = Win32API.new('crypt32', 'CryptProtectData', 'PPPPPLP', 'I')
  @CryptUnprotectData = Win32API.new('crypt32', 'CryptUnprotectData', 'PPPPPLP', 'I')

  def self.error func
    puts "#{func} Error = #{@GetLastError.call()}"
  end

  def self.encrypt str, entropy, desc
    pDataIn = [str.bytesize, str].pack('Lp')
    szDataDescr = (desc + "\0").encode(Encoding::UTF_16LE)
    pOptionalEntropy = [entropy.bytesize, entropy].pack('Lp')
    pvReserved = pPromptStruct = NULL
    dwFlags = CRYPTPROTECT_UI_FORBIDDEN
    pDataOut = [0, ''].pack('Lp')
    return error('CryptProtectData') if @CryptProtectData.call(pDataIn, szDataDescr, pOptionalEntropy, pvReserved, pPromptStruct, dwFlags, pDataOut) == 0
    cbData, pbData = pDataOut.unpack('LL')
    ret = ' '.encode(Encoding::BINARY) * cbData
    return error('RtlMoveMemory') if @RtlMoveMemory.call(ret, pbData, cbData) == 0
    return error('LocalFree') if @LocalFree.call(pbData) != NULL
    ret
  end

  def self.decrypt str, entropy, desc
    pDataIn = [str.bytesize, str].pack('Lp')
    ppszDataDescr = [NULL].pack('L')
    pOptionalEntropy = [entropy.bytesize, entropy].pack('Lp')
    pvReserved = pPromptStruct = NULL
    dwFlags = CRYPTPROTECT_UI_FORBIDDEN
    pDataOut = [0, ''].pack('Lp')
    return error('CryptUnprotectData') if @CryptUnprotectData.call(pDataIn, ppszDataDescr, pOptionalEntropy, pvReserved, pPromptStruct, dwFlags, pDataOut) == 0
    pszDataDescr = ppszDataDescr.unpack('L').first
    szDataDescr = ' '.encode(Encoding::UTF_16LE) * @lstrlen.call(pszDataDescr)
    return error('RtlMoveMemory') if @RtlMoveMemory.call(szDataDescr, pszDataDescr, szDataDescr.bytesize) == 0
    return error('LocalFree') if @LocalFree.call(pszDataDescr) != NULL
    szDataDescr.encode!(Encoding::UTF_8)
    cbData, pbData = pDataOut.unpack('LL')
    ret = ' '.encode(Encoding::BINARY) * cbData
    return error('RtlMoveMemory') if @RtlMoveMemory.call(ret, pbData, cbData) == 0
    return error('LocalFree') if @LocalFree.call(pbData) != NULL
    desc = '' unless desc
    return error('Unmatched description') unless desc == szDataDescr
    ret.force_encoding(Encoding::UTF_8)
  end
end

if $0 == __FILE__
  def test plain, entropy, desc
    puts "plain = #{plain}, entropy = #{entropy}, desc = #{desc}"
    cipher = Crypto.encrypt(plain, entropy, desc)
    puts "cipher = #{cipher.unpack('H*').first}"
    recover = Crypto.decrypt(cipher, entropy, desc)
    puts "recover = #{recover}"
  end

  begin
    test('abcd', 'efgh', 'ijkl')
  rescue
    puts $!.to_s.force_encoding(Encoding::UTF_8), $!.backtrace.join($/)
  end
end


-- 
http://bugs.ruby-lang.org/

In This Thread