diff options
Diffstat (limited to 'utils')
-rw-r--r-- | utils/mirror_vfd/mirror_server.c | 36 | ||||
-rw-r--r-- | utils/mirror_vfd/mirror_writer.c | 37 |
2 files changed, 50 insertions, 23 deletions
diff --git a/utils/mirror_vfd/mirror_server.c b/utils/mirror_vfd/mirror_server.c index 95480dc..79c9d80 100644 --- a/utils/mirror_vfd/mirror_server.c +++ b/utils/mirror_vfd/mirror_server.c @@ -471,12 +471,13 @@ wait_for_child(int H5_ATTR_UNUSED sig) static int handle_requests(struct server_run *run) { - int connfd = -1; /**/ - char mybuf[H5FD_MIRROR_XMIT_OPEN_SIZE]; /**/ - ssize_t ret; /* general-purpose error-checking */ - int pid; /* process ID of fork */ - struct sigaction sa; - int ret_value = 0; + int connfd = -1; + char *mybuf = NULL; + ssize_t ret; /* general-purpose error-checking */ + int pid; /* process ID of fork */ + struct sigaction sa; + H5FD_mirror_xmit_open_t *xopen = NULL; + int ret_value = 0; if (run == NULL || run->magic != SERVER_RUN_MAGIC) { mirror_log(NULL, V_ERR, "invalid server_run pointer"); @@ -501,6 +502,15 @@ handle_requests(struct server_run *run) return 1; } + if (NULL == (mybuf = HDmalloc(H5FD_MIRROR_XMIT_OPEN_SIZE * sizeof(char)))) { + mirror_log(NULL, V_ERR, "out of memory"); + goto error; + } + if (NULL == (xopen = HDmalloc(sizeof(H5FD_mirror_xmit_open_t)))) { + mirror_log(NULL, V_ERR, "out of memory"); + goto error; + } + /* Keep listening for attempts to connect. */ @@ -518,7 +528,7 @@ handle_requests(struct server_run *run) /* Read handshake from port connection. */ - if ((ret = HDread(connfd, &mybuf, H5FD_MIRROR_XMIT_OPEN_SIZE)) < 0) { + if ((ret = HDread(connfd, mybuf, H5FD_MIRROR_XMIT_OPEN_SIZE)) < 0) { mirror_log(run->loginfo, V_ERR, "read:%d", ret); goto error; } @@ -555,12 +565,11 @@ handle_requests(struct server_run *run) HDclose(connfd); } /* end if "CONFIRM" directive */ else if (H5FD_MIRROR_XMIT_OPEN_SIZE == ret) { - H5FD_mirror_xmit_open_t xopen; mirror_log(run->loginfo, V_INFO, "probable OPEN xmit received"); - H5FD_mirror_xmit_decode_open(&xopen, (const unsigned char *)mybuf); - if (FALSE == H5FD_mirror_xmit_is_open(&xopen)) { + H5FD_mirror_xmit_decode_open(xopen, (const unsigned char *)mybuf); + if (FALSE == H5FD_mirror_xmit_is_open(xopen)) { mirror_log(run->loginfo, V_WARN, "expected OPEN xmit was malformed"); HDclose(connfd); continue; @@ -575,7 +584,7 @@ handle_requests(struct server_run *run) } /* end if fork error */ else if (pid == 0) { /* child process (writer side of fork) */ mirror_log(run->loginfo, V_INFO, "executing writer"); - if (run_writer(connfd, &xopen) < 0) { + if (run_writer(connfd, xopen) < 0) { HDprintf("can't run writer\n"); } else { @@ -605,12 +614,17 @@ done: HDclose(connfd); } + HDfree(mybuf); + HDfree(xopen); + return ret_value; error: if (connfd >= 0) { HDclose(connfd); } + HDfree(mybuf); + HDfree(xopen); return -1; } /* end handle_requests() */ diff --git a/utils/mirror_vfd/mirror_writer.c b/utils/mirror_vfd/mirror_writer.c index f8d7544..0fec441 100644 --- a/utils/mirror_vfd/mirror_writer.c +++ b/utils/mirror_vfd/mirror_writer.c @@ -929,25 +929,33 @@ static int process_instructions(struct mirror_session *session) { struct sock_comm comm; - char xmit_buf[H5FD_MIRROR_XMIT_BUFFER_MAX]; /* raw bytes */ - H5FD_mirror_xmit_t xmit_recd; /* for decoded xmit header */ + char *xmit_buf = NULL; /* raw bytes */ + size_t buf_size; + H5FD_mirror_xmit_t xmit_recd; /* for decoded xmit header */ HDassert(session && (session->magic == MW_SESSION_MAGIC)); mirror_log(session->loginfo, V_INFO, "process_instructions()"); + buf_size = H5FD_MIRROR_XMIT_BUFFER_MAX * sizeof(char); + + if (NULL == (xmit_buf = HDmalloc(buf_size))) { + mirror_log(session->loginfo, V_ERR, "out of memory"); + goto error; + } + comm.magic = MW_SOCK_COMM_MAGIC; comm.recd_die = 0; /* Flag for program to terminate */ comm.xmit_recd = &xmit_recd; comm.raw = xmit_buf; - comm.raw_size = sizeof(xmit_buf); + comm.raw_size = buf_size; while (1) { /* sill-listening infinite loop */ /* Use convenience structure for raw/decoded info in/out */ if (receive_communique(session, &comm) < 0) { mirror_log(session->loginfo, V_ERR, "problem reading socket"); - return -1; + goto error; } if (comm.recd_die) { @@ -957,42 +965,42 @@ process_instructions(struct mirror_session *session) switch (xmit_recd.op) { case H5FD_MIRROR_OP_CLOSE: if (do_close(session) < 0) { - return -1; + goto error; } goto done; case H5FD_MIRROR_OP_LOCK: if (do_lock(session, (const unsigned char *)xmit_buf) < 0) { - return -1; + goto error; } break; case H5FD_MIRROR_OP_OPEN: mirror_log(session->loginfo, V_ERR, "OPEN xmit during session"); reply_error(session, "illegal OPEN xmit during session"); - return -1; + goto error; case H5FD_MIRROR_OP_SET_EOA: if (do_set_eoa(session, (const unsigned char *)xmit_buf) < 0) { - return -1; + goto error; } break; case H5FD_MIRROR_OP_TRUNCATE: if (do_truncate(session) < 0) { - return -1; + goto error; } break; case H5FD_MIRROR_OP_UNLOCK: if (do_unlock(session) < 0) { - return -1; + goto error; } break; case H5FD_MIRROR_OP_WRITE: if (do_write(session, (const unsigned char *)xmit_buf) < 0) { - return -1; + goto error; } break; default: mirror_log(session->loginfo, V_ERR, "unrecognized transmission"); reply_error(session, "unrecognized transmission"); - return -1; + goto error; } /* end switch (xmit_recd.op) */ } /* end while still listening */ @@ -1000,7 +1008,12 @@ process_instructions(struct mirror_session *session) done: comm.magic = 0; /* invalidate structure, on principle */ xmit_recd.magic = 0; /* invalidate structure, on principle */ + HDfree(xmit_buf); return 0; + +error: + HDfree(xmit_buf); + return -1; } /* end process_instructions() */ /* --------------------------------------------------------------------------- |