From: Date: July 3 2009 2:56pm Subject: bzr commit into mysql-5.1-telco-7.0 branch (jack:2940) Bug#45402 List-Archive: http://lists.mysql.com/commits/77898 X-Bug: 45402 Message-Id: <0KM700G1MIM7WBD0@mail-apac.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_9qbFQlF2xa6T5JUOdCiqyA)" --Boundary_(ID_9qbFQlF2xa6T5JUOdCiqyA) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///C:/w/repo/mysql-5.1-telco-7.0-bug45402/ based on revid:jack@stripped 2940 jack andrews 2009-07-03 Bug #45402 Win32AsyncFile::rmrfReq can run an infinite loop - added more remove() functions because AsyncFile does more than just a rmrf on a directory. it . deletes files . the contents of the dir (like rm -rf dir/*) modified: storage/ndb/include/util/DirIterator.hpp storage/ndb/src/common/util/DirIterator.cpp === modified file 'storage/ndb/include/util/DirIterator.hpp' --- a/storage/ndb/include/util/DirIterator.hpp 2009-07-02 18:39:07 +0000 +++ b/storage/ndb/include/util/DirIterator.hpp 2009-07-03 12:55:00 +0000 @@ -57,7 +57,16 @@ public: /* Remove a directory and all it's subdirecrories */ - int ndb_remove_dir_recursive(const char* name); +/* + Remove all entries in directory +*/ +int ndb_remove_dir_contents(const char* name); + +/* + a convenience function: tries unlink, then rmdir +*/ +int ndb_remove_entry(const char* name); + #endif === modified file 'storage/ndb/src/common/util/DirIterator.cpp' --- a/storage/ndb/src/common/util/DirIterator.cpp 2009-07-02 18:39:07 +0000 +++ b/storage/ndb/src/common/util/DirIterator.cpp 2009-07-03 12:55:00 +0000 @@ -252,6 +252,36 @@ static inline int rmdir(const char *s) } #endif +int ndb_remove_dir_contents(const char* name) +{ + DirIterator di; + DirIterator::Entry entry; + int rv; + require(!(rv = di.open(name))); + int has_entries = (long)di.next_entry(entry); + if (!has_entries) + return 0; + di.close(); + require(!di.open(name)); + while ((name = di.next_entry(entry))) + { BaseString bs; + bs.assfmt("%s%s%s", di.path(), DIR_SEPARATOR, entry.name); + if (entry.type == DirIterator::Entry::ISDIR) + { if(ndb_remove_entry(bs.c_str())) + return ndb_remove_dir_recursive(bs.c_str()); + } else + if (ndb_remove_entry(bs.c_str())) + return 1; + } + return 0; +} +int ndb_remove_entry(const char* name) +{ + if(!unlink(name) || !rmdir(name)) + return 0; + return -1; +} + int ndb_remove_dir_recursive(const char* dir) { struct stat statbuf; if(stat(dir,&statbuf)==-1 && errno==ENOENT) @@ -304,11 +334,8 @@ inline int mkdirectory(const char *path) } #define TMP "tmp_dir_iterator" -TAPTEST(DirIterator) +int build_tree() { - struct stat statbuf; - ndb_remove_dir_recursive(TMP); - OK(stat(TMP,&statbuf)==-1 && errno==ENOENT); OK(!mkdirectory(TMP)); fclose(fopen(TMP DIR_SEPARATOR "a","w")); OK(!mkdirectory(TMP DIR_SEPARATOR "d")); @@ -320,9 +347,28 @@ TAPTEST(DirIterator) #ifndef _WIN32 OK(!symlink("/etc",TMP "/d/symlink")); #endif - + return 0; +} +int check_gone(const char *file) +{ + struct stat statbuf; + OK(stat(file,&statbuf)==-1 && errno==ENOENT); + return 0; +} +TAPTEST(DirIterator) +{ + struct stat statbuf; + ndb_remove_dir_recursive(TMP); + check_gone(TMP); + build_tree(); OK(!ndb_remove_dir_recursive(TMP)); OK(stat(TMP,&statbuf)==-1 && errno==ENOENT); + check_gone(TMP); + build_tree(); + OK(!ndb_remove_dir_contents(TMP)); + OK(!mkdirectory(TMP DIR_SEPARATOR "a")); + ndb_remove_dir_contents(TMP); + OK(!rmdir(TMP)); return 1; } #endif --Boundary_(ID_9qbFQlF2xa6T5JUOdCiqyA) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/jack@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/jack@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jack@stripped # target_branch: file:///C:/w/repo/mysql-5.1-telco-7.0-bug45402/ # testament_sha1: 7b5ec8df6968113c2b2ea564aa6b2e0f5698149b # timestamp: 2009-07-03 14:56:21 +0200 # base_revision_id: jack@stripped # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWZahrVAAAzdfgF0we3f//3cr 3IC////+YAdO+3i5cADbAXY0ADoLCUTSEmT0ieaA01PSPKNPVPRpqeo9R6j1NMNEZqaemocZMmhi MTRgEYCYQBgJpo0yNAMNE0NCKPT1T0mmjIbU0ANABoAABoA00RT0Q1PEanpD0j1MmQ0Bo0AAAAAc ZMmhiMTRgEYCYQBgJpo0yNAMJJAgAI0aExGghpkNTTNRpDwo9QfqnqenqklZATfjMM09Fm5COY2f eYWL3iRK1jWzKiixjMR+cAXwUxRqBEv4tyezOkyFGOJnK0r0DyJiAMQmKkOZ3W+VPW5oxqC4LEC8 vLDygAp2AVqBDMdvn8v74V9kqtYzs6xt21J5l8VVQVQeJ/Er0uuQvb5zOidPCchE9AIo6+9weYcj FPPt2/sxe8OO7cBTr5IJ80XnqMjCDAb198dAp0XaSqmvkXaxuDLU7A3ZtTub0KoVsi12IB4pjIHB gXMrUSUmBphFrOBB4cBSs0DZVdAJD1cEtyzC0b43w0wXh1Ls/Dc45wIIcTHwVBFgLczfFbuEdsTB aZ5iT2cnvW6QORgQqgkWIFLs0Kw610yQrFrfUYcEotmBD0lYNkcrNSrAueVLEK8Bbmds5hZAOYXI W5aJH1tUVyj79AYkEqNN4xyP4EMk9iEDmMmqZa2SExh8qREmErPQ3I3kLFYTS2n9kVXe+cF2sDQ7 2Aex78AMXvnTICZdwapIiOcBJbB5Eq4AiIRZCeRU1SJFJlORP0JIczmqZnuc8tfEnY0RIVFR0uA+ uF1JoiRU/4GxVxdVijXi0186tLBjoTHFK41Y0D4wupEDD0YRsHjOmHATO0GTr4imm/POBiBNCmd5 ONXQIenm6Z705pGI+BrLEfE0D1CrRY0zvG2BtJlYQMA+ndXGpx/JqDFXlJtLDz8wP46eHDVdfxIa gP680TEZA4ypRyRgYmjKPST0tMTl724McmkxBD4msJhjMcMVbKbeYZGnS5CrjaxlqPnqVwSJF5Yc BjovjPfaYmi7ZAIilCNZmc5fNUYmRqMT1lluudmidw5EElYVRNgw3Y4oqLy0kaTM05dpcZ23nYc9 s6hZZWDLMIxgr0S8A4xcU+hxZe5GpgaTnKm8NtLRRO0jW4CMdEAYyShwCk3gUEUUmq2lmSi61txX VzaBE+mk0kdyIkFVRW9Lu5jq1RjmitboizymQ2o7aKQRStPzUDz8pQPxL8s4cS6XeZLK6rDPJKo/ Gw04hSLcMHScycb08d7GSkQeIl9JHOxChdSon1rj1h7SoW0+Ix3kCgpPces+/y72ErZtJkl7YYoW TsNMnvLmCoBjx/X4UJhlGcRRL4H8I1m0efAY1gtRfUbvLkoXL93KfrBasDYftEbgc5I1ZqmeYP2A pNJPh7vnmQ4Y1gfIXEgwlarpoZfOAlP7c0OcDPVhOUIvMBwwZDGbHMSDYQB1wFq1jwWjYTFBbstx tR9W1r5KTpS5Rbwi5V1zqrpLUyHIfk5qsEdlqKiAruGEzGBTgeWEB0CJkRlDTEgwlFQviwLtyORd oxRalrbRFCklxyNHI7XLSjRJy7z1usJy2W72ySKdpzYQGXGZku0czUoiKhinXBIylUGVcW4MGrNT yqEGwnRjKyhSNlTzs9UD0oY3nPtIkijnN5zKRUvqfaXKYQu35XMnhlQpMzy9biFz5kBqEl/fKhV0 GGiUkEc4V3e8wgnfafI8FUBLMDqFP0Dug08cgNz4BMeH6f90lK45zG9d/89gmYPAiWAUnnhFD9MZ qh5ewN1+h83ErZJsEfYTCwGS3oJarQ76AtcB+vk3IPiOBj9+dF9e16sIjkBTxmNiLH9LXAvBwA3J Gys7TW++2b1VvNXaJVjhUoWnmgaEHqmeAz6ysFPmqTj42feFTCqxZ9BClzERKMc3INFgwMdrLt3F FNFIyN2idFIw+VQVEyc/2UwVJhd3aKBSAmHI73Cf9HCGYFB65pavcPpo68YSAHTiNvxXfxhJIdTZ kODcgKC5eLxTTRBdY6IupTZI3zXrly5Bdp3TKewVluLDEqqhoAf5uRtp5PMYGvPZsOODbE8e8GE6 YrAeOeCclweIpeQRzk6bYwigDuH+DnDfky9kDUyff1bi+uwIANaE9ybsG47gOU1HAKojEZGnYEeu XsQQASCQX4TgKOP6igLUBjBVgag7mOu2qOM0nLBaUGgcaAKg7l1QoKa8EP0GntcWozKE88xKH1MK 8a2QyXpHm/3cH39mx54lAwUpPXprqCOMyM/upDMMV6Arq9D1v3m0eaSu49dAjFKMWGHLYnEzfdoD AilgvuAed7VsX9C+zB7z2xqEnHqtlDWBgY/LQdVURvcBmaRhGQY/PPWg1fM29Gd/JhQRUMgZkSdK SgSBClZheFl8FnWK9dSlzqjlAm0b5nvVH/8XckU4UJCWoa1Q --Boundary_(ID_9qbFQlF2xa6T5JUOdCiqyA)--