Changeset: ea460f306185 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ea460f306185
Modified Files:
tools/merovingian/utils/control.c
Branch: Feb2013
Log Message:
control_send: use separate buffer for reading from stream
On certain error messages we print what we read from the stream, which
is garbage if we are writing at that same buffer. Reported by Niels.
diffs (112 lines):
diff --git a/tools/merovingian/utils/control.c
b/tools/merovingian/utils/control.c
--- a/tools/merovingian/utils/control.c
+++ b/tools/merovingian/utils/control.c
@@ -56,6 +56,7 @@ char* control_send(
char* pass)
{
char sbuf[8096];
+ char rbuf[8096];
char *buf;
int sock = -1;
ssize_t len;
@@ -108,9 +109,9 @@ char* control_send(
}
/* try reading length */
- len = recv(sock, sbuf, 2, 0);
+ len = recv(sock, rbuf, 2, 0);
if (len == 2)
- len += recv(sock, sbuf + len, sizeof(sbuf) - len, 0);
+ len += recv(sock, rbuf + len, sizeof(rbuf) - len, 0);
/* perform login ritual */
if (len <= 0) {
snprintf(sbuf, sizeof(sbuf), "no response from
monetdbd");
@@ -119,22 +120,22 @@ char* control_send(
}
/* we only understand merovingian:1 and :2 (backwards compat
* <=Aug2011) and mapi v9 on merovingian */
- if (strncmp(sbuf, "merovingian:1:", strlen("merovingian:1:"))
== 0) {
- buf = sbuf + strlen("merovingian:1:");
+ if (strncmp(rbuf, "merovingian:1:", strlen("merovingian:1:"))
== 0) {
+ buf = rbuf + strlen("merovingian:1:");
ver = 1;
- } else if (strncmp(sbuf, "merovingian:2:",
strlen("merovingian:2:")) == 0) {
- buf = sbuf + strlen("merovingian:2:");
+ } else if (strncmp(rbuf, "merovingian:2:",
strlen("merovingian:2:")) == 0) {
+ buf = rbuf + strlen("merovingian:2:");
ver = 2;
- } else if (strstr(sbuf + 2, ":merovingian:9:") != NULL) {
- buf = sbuf + 2;
+ } else if (strstr(rbuf + 2, ":merovingian:9:") != NULL) {
+ buf = rbuf + 2;
ver = 9;
fdin = block_stream(socket_rastream(sock, "client in"));
fdout = block_stream(socket_wastream(sock, "client
out"));
} else {
if (len > 2 &&
- (strstr(sbuf + 2, ":BIG:") != NULL ||
- strstr(sbuf + 2, ":LIT:") != NULL))
+ (strstr(rbuf + 2, ":BIG:") != NULL ||
+ strstr(rbuf + 2, ":LIT:") != NULL))
{
snprintf(sbuf, sizeof(sbuf), "cannot connect: "
"server looks like a mapi
server, "
@@ -294,23 +295,23 @@ char* control_send(
if (fdin != NULL) {
/* stream.h is sooo broken :( */
- memset(sbuf, '\0', sizeof(sbuf));
- if (mnstr_read_block(fdin, sbuf, sizeof(sbuf) - 1, 1) <
0) {
+ memset(rbuf, '\0', sizeof(rbuf));
+ if (mnstr_read_block(fdin, rbuf, sizeof(rbuf) - 1, 1) <
0) {
close_stream(fdout);
close_stream(fdin);
return(strdup("no response from monetdbd after
login"));
}
- sbuf[strlen(sbuf) - 1] = '\0';
+ rbuf[strlen(rbuf) - 1] = '\0';
} else {
- if ((len = recv(sock, sbuf, sizeof(sbuf), 0)) <= 0) {
+ if ((len = recv(sock, rbuf, sizeof(rbuf), 0)) <= 0) {
close(sock);
return(strdup("no response from monetdbd after
login"));
}
- sbuf[len - 1] = '\0';
+ rbuf[len - 1] = '\0';
}
- if (strcmp(sbuf, "=OK") != 0 && strcmp(sbuf, "OK") != 0) {
- buf = sbuf;
+ if (strcmp(rbuf, "=OK") != 0 && strcmp(rbuf, "OK") != 0) {
+ buf = rbuf;
if (*buf == '!')
buf++;
if (fdin != NULL) {
@@ -397,20 +398,20 @@ char* control_send(
*ret = buf;
} else {
if (fdin != NULL) {
- if (mnstr_read_block(fdin, sbuf, sizeof(sbuf) - 1, 1) <
0) {
+ if (mnstr_read_block(fdin, rbuf, sizeof(rbuf) - 1, 1) <
0) {
close_stream(fdin);
close_stream(fdout);
return(strdup("incomplete response from
monetdbd"));
}
- sbuf[strlen(sbuf) - 1] = '\0';
- *ret = strdup(sbuf + 1);
+ rbuf[strlen(rbuf) - 1] = '\0';
+ *ret = strdup(rbuf + 1);
} else {
- if ((len = recv(sock, sbuf, sizeof(sbuf), 0)) <= 0) {
+ if ((len = recv(sock, rbuf, sizeof(rbuf), 0)) <= 0) {
close(sock);
return(strdup("incomplete response from
monetdbd"));
}
- sbuf[len - 1] = '\0';
- *ret = strdup(sbuf);
+ rbuf[len - 1] = '\0';
+ *ret = strdup(rbuf);
}
}
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list