X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Fsmartall.h;h=4973f4fa255819c4a6fd5ca6ed3896bc6b08d975;hb=8944db1b635424752b455e55dfc73cf4f26860d5;hp=37f8d73a3311aec38b396edde91518f641c94ca9;hpb=c6b644c66b95c441b2ab823a2fce4190920b7fd3;p=bacula%2Fbacula diff --git a/bacula/src/lib/smartall.h b/bacula/src/lib/smartall.h index 37f8d73a33..4973f4fa25 100644 --- a/bacula/src/lib/smartall.h +++ b/bacula/src/lib/smartall.h @@ -6,7 +6,7 @@ The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. This program is Free Software; you can redistribute it and/or - modify it under the terms of version two of the GNU General Public + modify it under the terms of version three of the GNU Affero General Public License as published by the Free Software Foundation and included in the file LICENSE. @@ -15,7 +15,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Affero General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -31,6 +31,9 @@ */ +#ifndef SMARTALLOC_H +#define SMARTALLOC_H + extern uint64_t DLL_IMP_EXP sm_max_bytes; extern uint64_t DLL_IMP_EXP sm_bytes; extern uint32_t DLL_IMP_EXP sm_max_buffers; @@ -85,8 +88,8 @@ extern int sm_check_rtn(const char *fname, int lineno, bool bufdump); #define sm_dump(x) #define sm_static(x) #define sm_new_owner(a, b, c) -#define sm_malloc(f, l, n) malloc(n) - +#define sm_malloc(f, l, n) malloc(n) +#define sm_free(f, l, n) free(n) #define sm_check(f, l, fl) #define sm_check_rtn(f, l, fl) 1 @@ -100,20 +103,29 @@ extern void *b_malloc(); #define New(type) new(__FILE__, __LINE__) type +/* We do memset(0) because it's not possible to memset a class when + * using subclass with virtual functions + */ + class SMARTALLOC { public: void *operator new(size_t s, const char *fname, int line) { - void *p = sm_malloc(fname, line, s > sizeof(int) ? (unsigned int)s : sizeof(int)); - return p; + size_t size = s > sizeof(int) ? (unsigned int)s : sizeof(int); + void *p = sm_malloc(fname, line, size); + memset(p, 0, size); + return p; } void *operator new[](size_t s, const char *fname, int line) { - void *p = sm_malloc(fname, line, s > sizeof(int) ? (unsigned int)s : sizeof(int)); + size_t size = s > sizeof(int) ? (unsigned int)s : sizeof(int); + void *p = sm_malloc(fname, line, size); + memset(p, 0, size); return p; } + void operator delete(void *ptr) { free(ptr); @@ -127,18 +139,17 @@ void operator delete(void *ptr, const char * /*fname*/, int /*line*/) { free(ptr); } -void operator delete[](void *ptr, size_t /*i*/, const char * /*fname*/, int /*line*/) +void operator delete[](void *ptr, size_t /*i*/, + const char * /*fname*/, int /*line*/) { free(ptr); } - private: void *operator new(size_t s) throw() { (void)s; return 0; } void *operator new[](size_t s) throw() { (void)s; return 0; } }; - #else #define New(type) new type @@ -147,10 +158,14 @@ class SMARTALLOC { public: void *operator new(size_t s) { - return malloc(s); + void *p = malloc(s); + memset(p, 0, s); + return p; } void *operator new[](size_t s) { - return malloc(s); + void *p = malloc(s); + memset(p, 0, s); + return p; } void operator delete(void *ptr) { free(ptr); @@ -159,4 +174,6 @@ class SMARTALLOC free(ptr); } }; -#endif +#endif /* SMARTALLOC */ + +#endif /* !SMARTALLOC_H */