Commit 5f8337fc authored by unknown's avatar unknown

Fixed Bug#6109, 'mysql' command line client segfaults on 'quit' command.

It also did not write ~/.mysql_history file. The problem was in alloc(),
which probably does not work on HP-UX-11.23 ia64 platform. Changed some
macros into functions for better maintenance and debugging.

parent 6044a07f
...@@ -63,7 +63,7 @@ __weak_alias(vis,_vis) ...@@ -63,7 +63,7 @@ __weak_alias(vis,_vis)
#include <limits.h> #include <limits.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <assert.h>
#undef BELL #undef BELL
#if defined(__STDC__) #if defined(__STDC__)
#define BELL '\a' #define BELL '\a'
...@@ -79,22 +79,24 @@ __weak_alias(vis,_vis) ...@@ -79,22 +79,24 @@ __weak_alias(vis,_vis)
#define MAXEXTRAS 5 #define MAXEXTRAS 5
#define MAKEEXTRALIST(flag, extra, orig) \ char *MAKEEXTRALIST(uint flag, const char *orig)
do { \ {
const char *o = orig; \ const char *o = orig;
char *e; \ char *e, *extra;
while (*o++) \ while (*o++)
continue; \ continue;
extra = alloca((size_t)((o - orig) + MAXEXTRAS)); \ extra = (char*) malloc((size_t)((o - orig) + MAXEXTRAS));
for (o = orig, e = extra; (*e++ = *o++) != '\0';) \ assert(extra);
continue; \ for (o = orig, e = extra; (*e++ = *o++) != '\0';)
e--; \ continue;
if (flag & VIS_SP) *e++ = ' '; \ e--;
if (flag & VIS_TAB) *e++ = '\t'; \ if (flag & VIS_SP) *e++ = ' ';
if (flag & VIS_NL) *e++ = '\n'; \ if (flag & VIS_TAB) *e++ = '\t';
if ((flag & VIS_NOSLASH) == 0) *e++ = '\\'; \ if (flag & VIS_NL) *e++ = '\n';
*e = '\0'; \ if ((flag & VIS_NOSLASH) == 0) *e++ = '\\';
} while (/*CONSTCOND*/0) *e = '\0';
return extra;
}
/* /*
...@@ -198,15 +200,16 @@ svis(dst, c, flag, nextc, extra) ...@@ -198,15 +200,16 @@ svis(dst, c, flag, nextc, extra)
int c, flag, nextc; int c, flag, nextc;
const char *extra; const char *extra;
{ {
char *nextra; char *nextra, *to_be_freed;
_DIAGASSERT(dst != NULL); _DIAGASSERT(dst != NULL);
_DIAGASSERT(extra != NULL); _DIAGASSERT(extra != NULL);
MAKEEXTRALIST(flag, nextra, extra); nextra= to_be_freed= MAKEEXTRALIST(flag, extra);
if (flag & VIS_HTTPSTYLE) if (flag & VIS_HTTPSTYLE)
HVIS(dst, c, flag, nextc, nextra); HVIS(dst, c, flag, nextc, nextra);
else else
SVIS(dst, c, flag, nextc, nextra); SVIS(dst, c, flag, nextc, nextra);
*dst = '\0'; *dst = '\0';
free(to_be_freed);
return(dst); return(dst);
} }
...@@ -235,12 +238,12 @@ strsvis(dst, src, flag, extra) ...@@ -235,12 +238,12 @@ strsvis(dst, src, flag, extra)
{ {
char c; char c;
char *start; char *start;
char *nextra; char *nextra, *to_be_freed;
_DIAGASSERT(dst != NULL); _DIAGASSERT(dst != NULL);
_DIAGASSERT(src != NULL); _DIAGASSERT(src != NULL);
_DIAGASSERT(extra != NULL); _DIAGASSERT(extra != NULL);
MAKEEXTRALIST(flag, nextra, extra); nextra= to_be_freed= MAKEEXTRALIST(flag, extra);
if (flag & VIS_HTTPSTYLE) { if (flag & VIS_HTTPSTYLE) {
for (start = dst; (c = *src++) != '\0'; /* empty */) for (start = dst; (c = *src++) != '\0'; /* empty */)
HVIS(dst, c, flag, *src, nextra); HVIS(dst, c, flag, *src, nextra);
...@@ -249,6 +252,7 @@ strsvis(dst, src, flag, extra) ...@@ -249,6 +252,7 @@ strsvis(dst, src, flag, extra)
SVIS(dst, c, flag, *src, nextra); SVIS(dst, c, flag, *src, nextra);
} }
*dst = '\0'; *dst = '\0';
free(to_be_freed);
return (dst - start); return (dst - start);
} }
...@@ -263,12 +267,12 @@ strsvisx(dst, src, len, flag, extra) ...@@ -263,12 +267,12 @@ strsvisx(dst, src, len, flag, extra)
{ {
char c; char c;
char *start; char *start;
char *nextra; char *nextra, *to_be_freed;
_DIAGASSERT(dst != NULL); _DIAGASSERT(dst != NULL);
_DIAGASSERT(src != NULL); _DIAGASSERT(src != NULL);
_DIAGASSERT(extra != NULL); _DIAGASSERT(extra != NULL);
MAKEEXTRALIST(flag, nextra, extra); nextra= to_be_freed= MAKEEXTRALIST(flag, extra);
if (flag & VIS_HTTPSTYLE) { if (flag & VIS_HTTPSTYLE) {
for (start = dst; len > 0; len--) { for (start = dst; len > 0; len--) {
...@@ -282,6 +286,7 @@ strsvisx(dst, src, len, flag, extra) ...@@ -282,6 +286,7 @@ strsvisx(dst, src, len, flag, extra)
} }
} }
*dst = '\0'; *dst = '\0';
free(to_be_freed);
return (dst - start); return (dst - start);
} }
...@@ -295,16 +300,18 @@ vis(dst, c, flag, nextc) ...@@ -295,16 +300,18 @@ vis(dst, c, flag, nextc)
int c, flag, nextc; int c, flag, nextc;
{ {
char *extra; char *extra, *to_be_freed;
_DIAGASSERT(dst != NULL); _DIAGASSERT(dst != NULL);
MAKEEXTRALIST(flag, extra, ""); extra= to_be_freed= MAKEEXTRALIST(flag, "");
if (flag & VIS_HTTPSTYLE) if (flag & VIS_HTTPSTYLE)
HVIS(dst, c, flag, nextc, extra); HVIS(dst, c, flag, nextc, extra);
else else
SVIS(dst, c, flag, nextc, extra); SVIS(dst, c, flag, nextc, extra);
*dst = '\0'; *dst = '\0';
free(to_be_freed);
return (dst); return (dst);
} }
...@@ -326,9 +333,12 @@ strvis(dst, src, flag) ...@@ -326,9 +333,12 @@ strvis(dst, src, flag)
int flag; int flag;
{ {
char *extra; char *extra;
int tmp;
MAKEEXTRALIST(flag, extra, ""); extra= MAKEEXTRALIST(flag, "");
return (strsvis(dst, src, flag, extra)); tmp= strsvis(dst, src, flag, extra);
free(extra);
return tmp;
} }
...@@ -340,8 +350,11 @@ strvisx(dst, src, len, flag) ...@@ -340,8 +350,11 @@ strvisx(dst, src, len, flag)
int flag; int flag;
{ {
char *extra; char *extra;
int tmp;
MAKEEXTRALIST(flag, extra, ""); extra= MAKEEXTRALIST(flag, "");
return (strsvisx(dst, src, len, flag, extra)); tmp= strsvisx(dst, src, len, flag, extra);
free(extra);
return tmp;
} }
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment