libsmb: Use reparse_data_buffer_marshall() in cli_symlink_send()
authorVolker Lendecke <vl@samba.org>
Thu, 21 Sep 2023 14:23:41 +0000 (07:23 -0700)
committerJeremy Allison <jra@samba.org>
Mon, 25 Sep 2023 17:09:37 +0000 (17:09 +0000)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/libsmb/clisymlink.c

index 59887d3585ef58e28a7a0ad1696f8e37cb28db01..d13332b11bdf6cd4afaf357efa3f541fe2216c3c 100644 (file)
@@ -207,28 +207,46 @@ struct tevent_req *cli_symlink_send(TALLOC_CTX *mem_ctx,
 {
        struct tevent_req *req = NULL, *subreq = NULL;
        struct cli_symlink_state *state = NULL;
-       DATA_BLOB blob = {};
-       bool ok;
+       struct reparse_data_buffer reparse_buf = {
+               .tag = IO_REPARSE_TAG_SYMLINK,
+               .parsed.lnk.substitute_name =
+                       discard_const_p(char, link_target),
+               .parsed.lnk.print_name = discard_const_p(char, link_target),
+               .parsed.lnk.flags = flags,
+       };
+       uint8_t *buf;
+       ssize_t buflen;
 
        req = tevent_req_create(mem_ctx, &state, struct cli_symlink_state);
        if (req == NULL) {
                return NULL;
        }
 
-       ok = symlink_reparse_buffer_marshall(link_target,
-                                            NULL,
-                                            0,
-                                            flags,
-                                            state,
-                                            &blob.data,
-                                            &blob.length);
-
-       if (!ok) {
+       buflen = reparse_data_buffer_marshall(&reparse_buf, NULL, 0);
+       if (buflen == -1) {
                tevent_req_oom(req);
                return tevent_req_post(req, ev);
        }
 
-       subreq = cli_create_reparse_point_send(state, ev, cli, newpath, blob);
+       buf = talloc_array(state, uint8_t, buflen);
+       if (tevent_req_nomem(buf, req)) {
+               return tevent_req_post(req, ev);
+       }
+
+       buflen = reparse_data_buffer_marshall(&reparse_buf, buf, buflen);
+       if (buflen != talloc_array_length(buf)) {
+               tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+               return tevent_req_post(req, ev);
+       }
+
+       subreq = cli_create_reparse_point_send(state,
+                                              ev,
+                                              cli,
+                                              newpath,
+                                              (DATA_BLOB){
+                                                      .data = buf,
+                                                      .length = buflen,
+                                              });
        if (tevent_req_nomem(subreq, req)) {
                return tevent_req_post(req, ev);
        }