ManageIQ / manageiq

ManageIQ Open-Source Management Platform
https://manageiq.org
Apache License 2.0
1.35k stars 898 forks source link

Force binary string literals in ruby scripts to be ASCII-8BIT #589

Closed jrafanie closed 10 years ago

jrafanie commented 10 years ago

Ruby 2.0 will convert strings in ruby scripts to UTF8... we've had issues such as #218 #465 where binary string literals were converted to UTF8 as invalid encodings and caused tests to fail.

We still have some potential binary string literals buried in ruby scripts that might not be exposed directly in failed unit tests... Are there other grep patterns I should try to verify each of these?

See below: [EDIT] Used better regular expression to get more binary string literal possibilities

Another regexp usable in editors (where you don't have to shell escape things)

\\[xu]?\d\d?\d?\d?

List all of the binary string literal possibilities in ruby scripts:

git grep -En "\\\[xu]?[0-9][0-9]?[0-9]?[0-9]?" **/*.rb

lib/VMwareWebService/MiqVimInventory.rb:1655:     return p.gsub(/^\[([^\]]*)\].*/, '\1')
lib/VdiCitrix/VdiCitrixInventory.rb:705:  copy-Item -Path Registry::HKLM\\SOFTWARE\\wow6432node\\Microsoft\\PowerShell\\1\\PowerShellSnapIns\\XDCommands -Destination Registry::HKLM\\SOFTWARE\\Microsoft\\PowerShell\\1\\PowerShellSnapIns -ErrorAction SilentlyContinue
lib/VdiCitrix/VdiCitrixInventory.rb:733:    citrix_vdi_paths = %w{SOFTWARE\\Microsoft\\PowerShell\\1\\PowerShellSnapIns\\XDCommands
lib/VdiCitrix/VdiCitrixInventory.rb:734:                          SOFTWARE\\wow6432node\\Microsoft\\PowerShell\\1\\PowerShellSnapIns\\XDCommands
lib/VdiCitrix/VdiCitrixInventory.rb:735:                          SOFTWARE\\Microsoft\\PowerShell\\1\\PowerShellSnapIns\\Citrix.Broker.Admin.V1
lib/VdiCitrix/VdiCitrixInventory.rb:736:                          SOFTWARE\\Wow6432Node\\Microsoft\\PowerShell\\1\\PowerShellSnapIns\\Citrix.Broker.Admin.V1}
lib/VdiVmware/VdiVmwareInventory.rb:447:    ps_snapin_reg_keys = %w{SOFTWARE\\Microsoft\\PowerShell\\1\\PowerShellSnapIns\\VMware.View.Broker
lib/VdiVmware/VdiVmwareInventory.rb:448:                          SOFTWARE\\wow6432node\\Microsoft\\PowerShell\\1\\PowerShellSnapIns\\VMware.View.Broker}
lib/VixDiskLib/vixdisklib_api.rb:200:    keys.split("\x00")
lib/VolumeManager/MiqLdm.rb:165:    ph.disk_id.delete!("\000")
lib/VolumeManager/MiqLdm.rb:166:    ph.diskgroup_id.delete!("\000")
lib/VolumeManager/MiqLdm.rb:167:    ph.diskgroup_name.delete!("\000")
lib/VolumeManager/MiqLdm.rb:168:    ph.host_id.delete!("\000")
lib/VolumeManager/MiqLdm.rb:284:      vblk.volume_state = BinaryStruct.stepDecode(buf, "a14").delete("\000")
lib/VolumeManager/MiqLvm.rb:20:    FMTT_MAGIC          = "\040\114\126\115\062\040\170\133\065\101\045\162\060\116\052\076"
lib/WriteVm/test/gen_logfile.rb:44:buf = "\000" * BLOCK_SIZE
lib/db/MiqSqlite/MiqSqlite3.rb:51:#       0      16     Header string: "SQLite format 3\000"
lib/db/MiqSqlite/MiqSqlite3.rb:209:    'a16',  'magic',                     #       0      16     Header string: "SQLite format 3\000"
lib/db/MiqSqlite/MiqSqlite3.rb:285:      raise "#{@filename} is not a SQLite3 Database."                                 if @header.magic != "SQLite format 3\000"
lib/db/MiqSqlite/MiqSqlite3Cell.rb:71:            fdata = "\x00".concat(fdata) if flen == 3
lib/disk/modules/MSVSDiffDisk.rb:25:      next if @locators[idx - 1]['platform_code'] == "\000\000\000\000"
lib/disk/modules/VMWareDiskProbe.rb:65:   pos  = desc.index("\000")
lib/disk/modules/VMWareDiskProbe.rb:72:    return ( str.count( "^ -~", "^\r\n" ) / str.size > 0.3 || str.count( "\x00" ) > 0 ) unless str.empty?
lib/ec2Extract/Ec2Payload.rb:14:  GLOBAL_KEY = "\222dL\256\177\311X)\177\332\214*3\367\252\002\023\034\305\243\274\252\312X\276\b\273\261\331(\216\310"
lib/ec2Extract/Ec2Payload.rb:37:    cip1.iv   = "\000" * cip1.iv_len
lib/ec2Extract/Ec2Payload.rb:97:    cip2.iv   = "\000" * cip2.iv_len
lib/fs/MetakitFS/MetakitFS.rb:64:     return data.contents.split("\0")
lib/fs/MetakitFS/MetakitFS.rb:291:      tags = tagStr.split("\0")
lib/fs/MetakitFS/MetakitFS.rb:294:      tagStr = tags.join("\0")
lib/fs/MetakitFS/MetakitFS.rb:315:      tags = tagStr.split("\0")
lib/fs/MetakitFS/MetakitFS.rb:317:      tagStr = tags.join("\0")
lib/fs/MetakitFS/MetakitFS.rb:339:      return tags.contents.split("\0")
lib/fs/MetakitFS/MetakitFS.rb:433:      dirEnts = dataStr.split("\0")
lib/fs/MetakitFS/MetakitFS.rb:435:      dataStr = dirEnts.join("\0")
lib/fs/MetakitFS/MetakitFS.rb:476:            dirName = File.basename(p) + "\0"
lib/fs/ReiserFS/ReiserFSDirectory.rb:133:      i = data.index("\0")
lib/fs/ext3/Ext3Superblock.rb:198:      @sb['vol_name'].delete!("\000")
lib/fs/ext3/Ext3Superblock.rb:199:      @sb['last_mnt_path'].delete!("\000")
lib/fs/ext4/Ext4Superblock.rb:185:      @sb['vol_name'].delete!("\000")
lib/fs/ext4/Ext4Superblock.rb:186:      @sb['last_mnt_path'].delete!("\000")
lib/fs/fat32/Fat32BootSect.rb:298:        if local.length < @bytesPerCluster then local = local + ("\0" * (@bytesPerCluster - local.length)) end
lib/fs/fat32/Fat32DirectoryEntry.rb:346:        pre_name += n.gsub(/\377/, "").UnicodeToUtf8.gsub(/\000/, "")
lib/fs/fat32/Fat32DirectoryEntry.rb:394:        name += "\000"
lib/fs/fat32/Fat32DirectoryEntry.rb:403:            ent["#{comp[LFN_NC_HASHNAME]}"] = "\377" * (comp[LFN_NC_LENGTH] * 2)
lib/fs/fat32/Fat32DirectoryEntry.rb:408:              ptName += "\377" * (comp[LFN_NC_LENGTH] * 2 - ptName.length)
lib/fs/iso9660/Iso9660Util.rb:45:   return Time.at(0).gmtime if isoShort == "\0" * 7
lib/fs/ntfs/NtUtil.rb:48:      raise "Uninitialized"   if signature == "\000\000\000\000"
lib/fs/ntfs/NtfsBootSect.rb:217:      b &= @bpb['unused1'] == "\0" * 5
lib/fs/xfs/superblock.rb:216:      @sb['fs_name'].delete!("\000")
lib/metadata/linux/LinuxUsers.rb:142:    #     perl -we '@type=("Empty","Run Lvl","Boot","New Time","Old Time","Init","Login","Normal","Term","Account");$recs = ""; while (<>) {$recs .= $_};foreach (split(/(.{384})/s,$recs)) {next if length($_) == 0;my ($type,$pid,$line,$inittab,$user,$host,$t1,$t2,$t3,$t4,$t5) = $_ =~/(.{4})(.{4})(.{32})(.{4})(.{32})(.{256})(.{4})(.{4})(.{4})(.{4})(.{4})/s;if (defined $line && $line =~ /\w/) {$line =~ s/\x00+//g;$host =~ s/\x00+//g;$user =~ s/\x00+//g;printf("%s %-8s %-12s %10s %-45s \n",scalar(gmtime(unpack("I4",$t3))),$type[unpack("I4",$type)],$user,$line,$host)}}print"\n"' < /var/log/wtmp
lib/metadata/util/win32/Win32Accounts.rb:93:                if user_data["perm#{x}_sid"] && ["D\000\002\000", "\004\000\002\000"].include?(user_data["perm#{x}_perms"])
lib/metadata/util/win32/Win32Accounts.rb:330:   # \HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Builtin\Aliases\00000220\C (variable length) (builtin groups)
lib/metadata/util/win32/Win32Accounts.rb:636:     v['username'].UnicodeToUtf8!.tr!("\0", "")
lib/metadata/util/win32/Win32Accounts.rb:638:     v['fullname'].UnicodeToUtf8!.tr!("\0", "")
lib/metadata/util/win32/Win32Accounts.rb:640:     v['comment'].UnicodeToUtf8!.tr!("\0", "")
lib/metadata/util/win32/Win32Accounts.rb:642:     v['user_comment'].UnicodeToUtf8!.tr!("\0", "")
lib/metadata/util/win32/Win32Accounts.rb:644:     v['homedir'].UnicodeToUtf8!.tr!("\0", "")
lib/metadata/util/win32/Win32Accounts.rb:646:     v['homedir_conn'].UnicodeToUtf8!.tr!("\0", "")
lib/metadata/util/win32/Win32Accounts.rb:648:     v['script_path'].UnicodeToUtf8!.tr!("\0", "")
lib/metadata/util/win32/Win32Accounts.rb:650:     v['profile_path'].UnicodeToUtf8!.tr!("\0", "")
lib/metadata/util/win32/Win32Accounts.rb:652:     v['workstations'].UnicodeToUtf8!.tr!("\0", "")
lib/metadata/util/win32/Win32Accounts.rb:752:     c['group_name'].UnicodeToUtf8!.tr!("\0", "")
lib/metadata/util/win32/Win32Accounts.rb:754:     c['group_desc'].UnicodeToUtf8!.tr!("\0", "")
lib/metadata/util/win32/Win32EventLog.rb:69:    'a16', :magic,                # Always \001\001\001\001\002\002\002\002\003\003\003\003\004\004\004\004
lib/metadata/util/win32/Win32EventLog.rb:117:  MAGIC_CSR = "\x11\x11\x11\x11\x22\x22\x22\x22\x33\x33\x33\x33\x44\x44\x44\x44"
lib/metadata/util/win32/Win32EventLog.rb:505:        if str == "\000"
lib/metadata/util/win32/Win32EventLog.rb:522:  # The standard conversion doesn't terminate a string at \000\000 so use this.
lib/metadata/util/win32/Win32EventLog.rb:524:    idx = str.index("\000\000")
lib/metadata/util/win32/ms-registry.rb:206:   nkHash[:keyname] = read_buffer(offset + SIZEOF_REGISTRY_STRUCT_NK,nkHash[:name_length]-1).chomp("\0")
lib/metadata/util/win32/ms-registry.rb:343:     vkHash[:data].tr!("\0", "\n") unless vkHash[:data].nil?
lib/metadata/util/win32/ms-registry.rb:367:    if i = vkHash[:data].index("\0") then
lib/metadata/util/win32/ms-registry.rb:638:     7 =>  :REG_MULTI_SZ,          # A sequence of null-terminated strings, terminated by an empty string (\0).
lib/metadata/util/win32/ms-registry.rb:640:     #   String1\0String2\0String3\0LastString\0\0
lib/metadata/util/win32/ms-registry.rb:641:     # The first \0 terminates the first string, the second to the last \0 terminates the last string,
lib/metadata/util/win32/ms-registry.rb:642:     # and the final \0 terminates the sequence. Note that the final terminator must be factored into the length of the string.
lib/metadata/util/win32/peheader.rb:17:IMAGE_NT_SIGNATURE = "PE\0\0"
lib/metadata/util/win32/peheader.rb:153:        nameEnd = iiHash['Name'] + data[iiHash['Name']..-1].index("\0") -1
lib/metadata/util/win32/peheader.rb:256:            str.gsub!(/\000/, "")
lib/metadata/util/win32/peheader.rb:460:    viHash['sig'].UnicodeToUtf8!.tr!("\0", "")
lib/metadata/util/win32/peheader.rb:461:    viHash['code_page'].UnicodeToUtf8!.tr!("\0", "")
lib/metadata/util/win32/peheader.rb:462:    viHash['lang'].UnicodeToUtf8!.tr!("\0", "")
lib/metadata/util/win32/peheader.rb:481:      name.UnicodeToUtf8!.gsub!("\0", "")
lib/metadata/util/win32/peheader.rb:484:      value.UnicodeToUtf8!.gsub!("\0", "")
lib/metadata/util/win32/peheader.rb:836:STRINGFILEINFO  = "S\0t\0r\0i\0n\0g\0F\0i\0l\0e\0I\0n\0f\0o\0\0\0"
lib/metadata/util/win32/peheader.rb:837:VS_VERSION_INFO = "V\0S\0_\0V\0E\0R\0S\0I\0O\0N\0_\0I\0N\0F\0O\0\0\0"
lib/spec/db/MiqSqlite/varint_spec.rb:25:    expect(get_varint("\x00")).to eql(0x00000000)
lib/spec/db/MiqSqlite/varint_spec.rb:26:    expect(get_varint("\x7f")).to eql(0x0000007f)
lib/spec/db/MiqSqlite/varint_spec.rb:27:    expect(get_varint("\x81\x00")).to eql(0x00000080)
lib/spec/db/MiqSqlite/varint_spec.rb:28:    expect(get_varint("\x82\x00")).to eql(0x00000100)
lib/spec/db/MiqSqlite/varint_spec.rb:29:    expect(get_varint("\x80\x7f")).to eql(0x0000007f)
lib/spec/db/MiqSqlite/varint_spec.rb:30:    expect(get_varint("\x81\x91\xd1\xac\x78")).to eql(0x12345678)  # For some reason, the example in the comments is wrong!
lib/spec/db/MiqSqlite/varint_spec.rb:31:    expect(get_varint("\x81\x81\x81\x81\x01")).to eql(0x10204081)
lib/spec/ec2Extract/Ec2Payload_spec.rb:7:    binary_key = "\222dL\256\177\311X)\177\332\214*3\367\252\002\023\034\305\243\274\252\312X\276\b\273\261\331(\216\310"
lib/spec/util/MiqMemory_spec.rb:24:     buf[0, 1].should  == "\0"
lib/spec/util/MiqMemory_spec.rb:25:     buf[-1, 1].should == "\0"
lib/spec/util/extensions/miq-erb_for_yaml_spec.rb:19:      erb = MiqERBForYAML.new("--- \nname: <%= 'Joe\\234' %>")
lib/spec/util/extensions/miq-erb_for_yaml_spec.rb:20:      YAML.load(erb.result).should == {'name' => 'Joe\234'}
lib/spec/util/miq-password_spec.rb:53:      "\343\201\223\343\201\253\343\201\241\343\202\217",
lib/spec/util/miq-password_spec.rb:59:      "\345\257\206\347\240\201",
lib/spec/util/miq-unicode_spec.rb:9:      @unicode_str = "S\000Y\000S\000T\000E\000M\000\000\000\000\000\000\000"
lib/spec/util/miq-unicode_spec.rb:10:      @utf8_str    = "SYSTEM\000\000\000"
lib/spec/util/miq-unicode_spec.rb:43:      @utf8_str  = "123\303\245456"
lib/spec/util/miq-unicode_spec.rb:44:      @ascii_str = "123\345456"
lib/spec/util/miq-unicode_spec.rb:77:      @ucs2_str  = "1\000.\0008\000.\0007\000"
lib/spec/util/miq-uuid_spec.rb:33:    guid = MiqUUID.parse_raw("\001#Eg\211\253\315\357\253\315\357\001#Eg\211")
lib/spec/util/win32/wim_parser_spec.rb:20:        "image_tag"                   => "MSWIM\0\0\0",
lib/spec/util/win32/wim_parser_spec.rb:25:        "wim_guid"                    => "N\x91-\xF7a'\x8D@\x9A0\xC5\xF1~\xD7X\x16", # real GUID is pending adding support for winnt.h GUID structure parsing
lib/spec/util/win32/wim_parser_spec.rb:46:        "unused"                      => ("\0" * 60),
lib/test/DiskTestCommon/ntfs/tc_ntfs_mft.rb:39:   raise "Uninitialized MFT Entry <#{recordNumber}>" if @mft_entry['signature'] == "\000\000\000\000"
lib/test/DiskTestCommon/ntfs/tc_ntfs_mft.rb:117:          next if mh.mft_entry['signature'] == "\000\000\000\000"
lib/util/MiqMemory.rb:8:    return size >= PACK_MIN && size <= PACK_MAX ? [""].pack("a#{size}") : "\0" * size
lib/util/MiqMemory.rb:11:  def self.create_quad_buf; "\000\000\000\000\000\000\000\000"; end
lib/util/MiqMemory.rb:12:  def self.create_long_buf; "\000\000\000\000"; end
lib/util/MiqMemory.rb:13:  def self.create_short_buf; "\000\000"; end
lib/util/extensions/miq-erb_for_yaml.rb:12:    data.gsub(/<%= ([^>]+) %>/, '<%= Psych.to_json(\1).chomp %>')
lib/util/miq-process.rb:138:      return cmdline.gsub("\000", " ").strip unless cmdline.nil?
lib/util/miq-process.rb:206:        if cmd == cmdline.gsub("\000", " ").strip
lib/util/miq-soap4r.rb:30:          request.gsub(/(^.*<n1:password>).*?(<\/n1:password>.*$)/, '\1********\2')
lib/util/miq-uuid.rb:13:    return g.sub!(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '\1-\2-\3-\4-\5')
lib/util/pathname2.rb:496:         buf = buf.split("\0").first
lib/util/win32/miq-powershell.rb:23:    Win32::Registry::HKEY_LOCAL_MACHINE.open('SOFTWARE\\Microsoft\\PowerShell\\1\\ShellIds\\Microsoft.PowerShell') {|reg| path = reg['Path']}
lib/util/win32/miq-powershell.rb:66:    Win32::Registry::HKEY_LOCAL_MACHINE.open('SOFTWARE\\Microsoft\\PowerShell\\1\\PowerShellEngine') do |reg|
lib/util/win32/wim_parser.rb:20:    'a8',  'image_tag',          # Signature that identifies the file as a .wim file. Value is set to “MSWIM\0\0”.
lib/util/win32/wim_parser.rb:50:  IMAGE_TAG = "MSWIM\0\0\0"
lib/util/xml/miq_rexml.rb:47:   en = eleName.to_s.gsub(/^((xml)|([0-9]))/, '_\1').tr(' :()<>=', '_')
vmdb/config/initializers/inflections.rb:6:#   inflect.plural /^(ox)$/i, '\1en'
vmdb/config/initializers/inflections.rb:7:#   inflect.singular /^(ox)en/i, '\1'
vmdb/lib/pdf_generator.rb:42:      gsub(/src=["'](\S+)\?\d*["']/i, 'src="\1"')
vmdb/spec/lib/miq_ldap_spec.rb:125:    data = "\001\005\000\000\000\000\000\005\025\000\000\000+\206\301\364y\307\r\302=\336p\216\237\004\000\000"
vmdb/spec/migrations/20121102204300_change_binary_blob_and_binary_blob_part_size_values_from_character_length_to_bytesize_spec.rb:12:      utf8_string =  "--- Quota \xE2\x80\x93 Max CPUs\n...\n"
vmdb/spec/models/binary_blob_part_spec.rb:24:      @data = "--- Quota \xE2\x80\x93 Max CPUs\n...\n"
vmdb/spec/models/binary_blob_spec.rb:29:      @data = "--- Quota \xE2\x80\x93 Max CPUs\n...\n"
vmdb/spec/models/binary_blob_spec.rb:51:      @data = "--- Quota \xE2\x80\x93 Max CPUs\n...\n"
vmdb/spec/models/ems_refresh/refreshers/scvmm_refresher_spec.rb:165:      :location         => "\\ProgramData\\Microsoft\\Windows\\Hyper-V\\Salesforce_A\\Virtual Machines\\194AE824-BA4A-4809-B3BB-86E0ACA1489B.xml",
jrafanie commented 10 years ago

cc @Fryguy @tenderlove @roliveri @jerryk55 @gmcculloug

jrafanie commented 10 years ago

@roliveri I'd love to play with your camcorder tests for the various scanning layers on ruby 2.0.

tenderlove commented 10 years ago

Are these generated SOAP stubs?

chessbyte commented 10 years ago

@tenderlove None of these look like they are related to SOAP. The binary string literals in lib/disk, lib/VolumeManager, lib/fs, lib/metadata, lib/test are all part of the ManageIQ VM introspection (fleecing) code.

The VM fleecing code should be pulled out into its own gem (or multiple gems), and Rich will be presenting about that at our upcoming conference.

jrafanie commented 10 years ago

MiqLvm FMTT_MAGIC is ok

irb(main):009:0> string = "\040\114\126\115\062\040\170\133\065\101\045\162\060\116\052\076"
irb(main):010:0> string.force_encoding("ASCII-8BIT")  == string.force_encoding("UTF-8")
=> true

Deleting of UTF-8 strings from binary strings works as it did previously:

irb(main):018:0> string = "\000\000\000\000"
=> "\u0000\u0000\u0000\u0000"
irb(main):019:0> string.force_encoding("ASCII-8BIT").delete!(("\000").force_encoding("UTF-8"))
=> ""
jrafanie commented 10 years ago

More ok, instances of binary string literals in Win32Accounts.rb:

irb(main):023:0> string = "D\000\002\000"
=> "D\u0000\u0002\u0000"
irb(main):024:0> string.force_encoding("ASCII-8BIT")  == string.force_encoding("UTF-8")
=> true

irb(main):025:0> string = "\004\000\002\000"
=> "\u0004\u0000\u0002\u0000"
irb(main):026:0> string.force_encoding("ASCII-8BIT")  == string.force_encoding("UTF-8")
=> true
jrafanie commented 10 years ago

More ok strings from miqpassword spec and uuid spec:

irb(main):031:0> string = "\001#Eg\211\253\315\357\253\315\357\001#Eg\211"
=> "\u0001#Eg\x89\xAB\xCD\xEF\xAB\xCD\xEF\u0001#Eg\x89"
irb(main):032:0> string.force_encoding("ASCII-8BIT")  == string.force_encoding("UTF-8")
=> true

irb(main):027:0> string = "\343\201\223\343\201\253\343\201\241\343\202\217"
=> "こにちわ"
irb(main):028:0> string.force_encoding("ASCII-8BIT")  == string.force_encoding("UTF-8")
=> true

irb(main):029:0> string = "\343\201\223\343\201\253\343\201\241\343\202\217"^C
irb(main):029:0> string = "\345\257\206\347\240\201"
=> "密码"
jrafanie commented 10 years ago

These are the ones we need to fix in total:

jrafanie commented 10 years ago

get a list of files containing possible binary string literals that already have the magic comment:

git grep -l -E "\\\[xu]?[0-9][0-9]?[0-9]?[0-9]?" ../**/*.rb | xargs grep -l "encoding: US-ASCII" > binary_strings_with_magic_comment.txt

Find the ruby files with possible binary string literals that DO NOT have #encoding magic comment:

diff binary_strings_with_magic_comment.txt binary_strings.txt |grep -E "^\+.+rb"

+lib/VMwareWebService/MiqVimInventory.rb
+lib/VdiCitrix/VdiCitrixInventory.rb
+lib/VdiVmware/VdiVmwareInventory.rb
+lib/metadata/linux/LinuxUsers.rb
+lib/spec/util/extensions/miq-erb_for_yaml_spec.rb
+lib/spec/util/miq-password_spec.rb
+lib/spec/util/miq-unicode_spec.rb
+lib/spec/util/miq-uuid_spec.rb
+lib/util/extensions/miq-erb_for_yaml.rb
+lib/util/miq-soap4r.rb
+lib/util/miq-uuid.rb
+lib/util/win32/miq-powershell.rb
+lib/util/xml/miq_rexml.rb
+vmdb/config/initializers/inflections.rb
+vmdb/lib/pdf_generator.rb
+vmdb/spec/migrations/20121102204300_change_binary_blob_and_binary_blob_part_size_values_from_character_length_to_bytesize_spec.rb
+vmdb/spec/models/binary_blob_part_spec.rb
+vmdb/spec/models/binary_blob_spec.rb
+vmdb/spec/models/ems_refresh/refreshers/scvmm_refresher_spec.rb
jrafanie commented 10 years ago

fixed by #804 #732 #715