nfs4_create_clid_name failed to get the correct clidstr length
when clientid has opaque char.
Signed-off-by: Rong Zeng <rongzeng@us.ibm.com>
diff --git a/src/Log/display.c b/src/Log/display.c
index 74971b4..a71fcdb 100644
--- a/src/Log/display.c
+++ b/src/Log/display.c
@@ -394,9 +394,6 @@
if(len == 0)
return 0;
- /* Display the length of the value. */
- b_left = display_printf(dspbuf, "(%d:", len);
-
if(b_left <= 0)
return 0;
@@ -424,7 +421,7 @@
if(b_left <= 0)
return 0;
- return display_cat(dspbuf, ")");
+ return b_left;
}
/**
diff --git a/src/SAL/nfs4_recovery.c b/src/SAL/nfs4_recovery.c
index c24c1e3..6fbf8ec 100644
--- a/src/SAL/nfs4_recovery.c
+++ b/src/SAL/nfs4_recovery.c
@@ -186,21 +186,25 @@
struct sockaddr *local_addr_ptr;
sockaddr_t local_addr;
socklen_t addr_len;
- int total_len;
+ int total_len;
+ char cidstr_len[10];
struct display_buffer dspbuf = {sizeof(cidstr), cidstr, cidstr};
/* hold both long form clientid and IP */
if (convert_opaque_value_max_for_dir(&dspbuf,
cl_recp->cr_client_val, cl_recp->cr_client_val_len, PATH_MAX) > 0) {
- total_len = strlen(cidstr) + strlen(data->pworker->hostaddr_str) + 2;
+ /* convert_opaque_value_max_for_dir does not prefix
+ * the "(<length>:". So we need to do it here */
+ sprintf(cidstr_len, "%ld", strlen(cidstr));
+ total_len = strlen(cidstr) + strlen(data->pworker->hostaddr_str) + 5 + strlen(cidstr_len);
pclientid->cid_recov_dir = gsh_malloc(total_len);
if (pclientid->cid_recov_dir == NULL) {
LogEvent(COMPONENT_CLIENTID, "Mem_Alloc FAILED");
return;
}
memset(pclientid->cid_recov_dir, 0, total_len);
- (void) snprintf(pclientid->cid_recov_dir, total_len, "%s-%s",
- data->pworker->hostaddr_str, cidstr);
+ (void) snprintf(pclientid->cid_recov_dir, total_len, "%s-(%s:%s)",
+ data->pworker->hostaddr_str, cidstr_len, cidstr);
}
local_addr_ptr = (struct sockaddr *)&local_addr;