From: Bjorn Munch Date: December 9 2010 1:42pm Subject: bzr commit into mysql-5.1-mtr branch (bjorn.munch:2958) Bug#58522 List-Archive: http://lists.mysql.com/commits/126422 X-Bug: 58522 Message-Id: <201012091342.oB9DgljH003505@khepri15.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0948872089==" --===============0948872089== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/bm136801/my/rcvcp-51/ based on revid:bjorn.munch@stripped 2958 Bjorn Munch 2010-12-09 Bug #58522 mtr --debug leaks memory when test fails Backported use of setenv() from 5.5 This will remove the leak on systems that have setenv() I have not fixed the string.c leak, it's a local variable that the cleanup function cannot access. modified: client/mysqltest.cc === modified file 'client/mysqltest.cc' --- a/client/mysqltest.cc 2010-12-01 10:11:16 +0000 +++ b/client/mysqltest.cc 2010-12-09 13:42:04 +0000 @@ -73,6 +73,10 @@ #define QUERY_SEND_FLAG 1 #define QUERY_REAP_FLAG 2 +#ifndef HAVE_SETENV +static int setenv(const char *name, const char *value, int overwrite); +#endif + enum { OPT_SKIP_SAFEMALLOC=OPT_MAX_CLIENT_OPTION, OPT_PS_PROTOCOL, OPT_SP_PROTOCOL, OPT_CURSOR_PROTOCOL, OPT_VIEW_PROTOCOL, @@ -219,7 +223,6 @@ typedef struct int alloced_len; int int_dirty; /* do not update string if int is updated until first read */ int alloced; - char *env_s; } VAR; /*Perl/shell-like variable registers */ @@ -1962,7 +1965,7 @@ VAR *var_init(VAR *v, const char *name, val_len = strlen(val) ; val_alloc_len = val_len + 16; /* room to grow */ if (!(tmp_var=v) && !(tmp_var = (VAR*)my_malloc(sizeof(*tmp_var) - + name_len+1, MYF(MY_WME)))) + + name_len+2, MYF(MY_WME)))) die("Out of memory"); tmp_var->name = (name) ? (char*) tmp_var + sizeof(*tmp_var) : 0; @@ -1971,7 +1974,12 @@ VAR *var_init(VAR *v, const char *name, if (!(tmp_var->str_val = (char*)my_malloc(val_alloc_len+1, MYF(MY_WME)))) die("Out of memory"); - memcpy(tmp_var->name, name, name_len); + if (name) + { + memcpy(tmp_var->name, name, name_len); + tmp_var->name[name_len]= 0; + } + if (val) { memcpy(tmp_var->str_val, val, val_len); @@ -1982,7 +1990,6 @@ VAR *var_init(VAR *v, const char *name, tmp_var->alloced_len = val_alloc_len; tmp_var->int_val = (val) ? atoi(val) : 0; tmp_var->int_dirty = 0; - tmp_var->env_s = 0; return tmp_var; } @@ -2110,20 +2117,15 @@ void var_set(const char *var_name, const if (env_var) { - char buf[1024], *old_env_s= v->env_s; if (v->int_dirty) { sprintf(v->str_val, "%d", v->int_val); v->int_dirty= 0; v->str_val_len= strlen(v->str_val); } - my_snprintf(buf, sizeof(buf), "%.*s=%.*s", - v->name_len, v->name, - v->str_val_len, v->str_val); - if (!(v->env_s= my_strdup(buf, MYF(MY_WME)))) - die("Out of memory"); - putenv(v->env_s); - my_free(old_env_s, MYF(MY_ALLOW_ZERO_PTR)); + /* setenv() expects \0-terminated strings */ + DBUG_ASSERT(v->name[v->name_len] == 0); + setenv(v->name, v->str_val, 1); } DBUG_VOID_RETURN; } @@ -9899,3 +9901,18 @@ void dynstr_append_sorted(DYNAMIC_STRING delete_dynamic(&lines); DBUG_VOID_RETURN; } + +#ifndef HAVE_SETENV +static int setenv(const char *name, const char *value, int overwrite) +{ + size_t buflen= strlen(name) + strlen(value) + 2; + char *envvar= (char *)malloc(buflen); + if(!envvar) + return ENOMEM; + strcpy(envvar, name); + strcat(envvar, "="); + strcat(envvar, value); + putenv(envvar); + return 0; +} +#endif --===============0948872089== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/bjorn.munch@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: bjorn.munch@stripped # target_branch: file:///home/bm136801/my/rcvcp-51/ # testament_sha1: 71929d54a8ac7953eded12aeeebca64d65398b01 # timestamp: 2010-12-09 14:42:47 +0100 # base_revision_id: bjorn.munch@stripped\ # 2v5r4mk1fv2e13zf # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWb2+80IAAj1fgEAQeP///3fj n66////6UAVbm7vdBnLu7Y09t3Y6ASiJpTemqNM1NHlPSeoeoMgB6QA0ANMjIBKIhpoYptE0pnpR jUeiGgPUYgAMgyAGkxBTUafqNAmyNTyjQDQAAAaA0D1BIpJkxT00g0A09TIBoAGgA0PUAAEkhMjU yZGgBNGCj1NTwkeo9IbSAHqB6m1IIQ67zL9Ac3FDM/OME9c+GuQO7421IMaYELNEAbn5zuKiqmEj RVpliKSN3oR2LGEmpzEiNoYm22y9i2MfO+MlonHNViuMBub2brXzHRTlEIsBJcibz3B1PNcu1ZMi vcUPVuL1tTlpk5KMoYFTihrVx/sX33OpfkkKRYM2cct+o4VzrL4HFVDsUYVbsnFIUaO7bqHksH11 kiGpzjdRG+5MuS2BBDIHKBGw0uyRyE2RiCVFzJjuYKraEwKO3nfSRpbQ2rvtA7WlLTtpDbByaOU5 iM3uXGOdmXV44ZdxYpN6oTXn2rbIuC/BLiIaCIUYHtg6WlwIouNaCyRErDh6Q4F2Ov4GMHiiY3IH qSqP7sgTeUxkLvpAz74hFhH3bjZ74E4tCiAh5UMxJ92G2q1A5dyY+RVurdLEO5O3wnQJxPKZJ3vc WclarsF538QVmiQnIJitMrFNjj5kI4dDSfpzfM2QGYM7BgvwLao9F4XWFNWOBF6CpZ64GThOPpec 5qzX7pCp2rdJFDRaAqqxUsIilLpBkQ3FZaJlvFQIY7Q0HTwW60xOuq4MA1L4xiHclhobSCSNJShN LReZxmKVkyCM4kXCFgDfJLaIywgqXCvGNgPRmGbH0mdrU5RJlN0rlFg/Wyc78sDGXetvp4i4RksK mK16A2OUe3hWUKFxfhHURVN6GMkcDISRR7FgYcZMVxtDwFezfJqmQ9WJHkFPL0ZcmzNaXWapJHXf vCbaIfmIfaUVV+F6ajBNGtnrPpPAzZXEIZssXyaC/1p4z/PSBPukUEbjET2HpMxP6YoPz1PH8PIn QHLm8vL0e5za9NiIW7otCyhOj1W8jAmiJOup0xL3ARQV8RGMeryIs1pw3OIlFtldyvOE3w4zkFZl 02aV67PuCF08o/04yHiX46J7S+m0vHnrX0IWHFNFL2BO8JpF8SB02dM8r/2HBrz7/K7oKljinQW1 LpL4GSQ44HrTq8uLNluZzZeWtzM5hwyiC3dW1Wl+m2JnkB7J6n2M55XUDAqlQHDjGz4rrzlFW1na 06MV2fphM4ITmB8zXSWoqRS9OAed2ijb+rtUzBquoBpCsLRg5UKiR5teb3v0mHhoxjGlq+o5ZSro FtH1nX1VHIgbnnNmaaoIMXI5ii0SsTBXQYtAmGp6+3BbSjLtRAdG5hTvx6RaGchwb6S0uHbKglEo DjzxpryDv7QWt5bMk4ns8+aIb9mQmnZ+FmkIcZabHGwN9wQeGGFKQxenYDBjZmGDZI5mVQe7YRrg vIhMvtBNFyInlJTAjmnSR4+ksDX8KRaOSihTlkTgkODY75Lum/BtjH/S5dtgoBpJk3qyPtnQFARE zKhknJhdpTnLaW1ApPYOx4QPVIzBSvMF7x+pi4ufWeAr64b1kE4jrZk48Ku2yf1ypwFspVrQK5gN CmnPrSXJyrroQw7i4fTtqOMawtLEboGAlGTo0VKooZ5O/08tcKVfCd6G3eaXVA1FS6+PwbcvgWHS DI1EKw44EnNZr0W3oc/ADUMOILY9/UQVA6G+GFGZsmWzWmGZFNjFVpu9mmwLlqcA6iTlitP5FrtD IdzaDd5YUh2DDmMu/iPChLIc4wpXcsZ0Sj1n1IgM/RrNmCxOJg4Xj2EBVVD9gxx3G0xNgCJ7cw4s NRpWnpOsyj8ta+lWd5K0v5s3/i7kinChIXt95oQ= --===============0948872089==--