libsmb: Pass NTTIME to interpret_long_date()
authorVolker Lendecke <vl@samba.org>
Wed, 4 Oct 2023 11:25:21 +0000 (13:25 +0200)
committerJeremy Allison <jra@samba.org>
Wed, 4 Oct 2023 20:31:36 +0000 (20:31 +0000)
Separate concerns of conversion and pulling off the wire. Needed soon
for smb311 pidl generated parsing.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
examples/fuse/clifuse.c
source3/include/proto.h
source3/lib/time.c
source3/libsmb/cli_smb2_fnum.c
source3/libsmb/clifile.c
source3/libsmb/clifsinfo.c
source3/libsmb/clilist.c
source3/libsmb/clirap.c
source3/torture/test_smb1_dfs.c

index 533fe14c2d4a79f52f0fd6cbae70d8bcee7a8f32..28c5177b2500ac38ec83593d5157fc19ad7ec0ec 100644 (file)
@@ -327,10 +327,10 @@ static void cli_get_unixattr_gotinfo(struct tevent_req *subreq)
                return;
        }
 
-       state->create_time = interpret_long_date((char *)outbuf.data + 0x0);
-       state->access_time = interpret_long_date((char *)outbuf.data + 0x8);
-       state->write_time  = interpret_long_date((char *)outbuf.data + 0x10);
-       state->change_time = interpret_long_date((char *)outbuf.data + 0x18);
+       state->create_time = interpret_long_date(BVAL(outbuf.data, 0));
+       state->access_time = interpret_long_date(BVAL(outbuf.data, 0x8));
+       state->write_time  = interpret_long_date(BVAL(outbuf.data, 0x10));
+       state->change_time = interpret_long_date(BVAL(outbuf.data, 0x18));
        state->mode        = IVAL(outbuf.data, 0x20);
        state->size        = BVAL(outbuf.data, 0x30);
        state->ino         = BVAL(outbuf.data, 0x40);
@@ -502,10 +502,10 @@ static NTSTATUS parse_finfo_id_both_directory_info(uint8_t *dir_data,
                return NT_STATUS_INFO_LENGTH_MISMATCH;
        }
 
-       finfo->btime_ts = interpret_long_date((const char *)dir_data + 8);
-       finfo->atime_ts = interpret_long_date((const char *)dir_data + 16);
-       finfo->mtime_ts = interpret_long_date((const char *)dir_data + 24);
-       finfo->ctime_ts = interpret_long_date((const char *)dir_data + 32);
+       finfo->btime_ts = interpret_long_date(BVAL(dir_data, 8));
+       finfo->atime_ts = interpret_long_date(BVAL(dir_data, 16));
+       finfo->mtime_ts = interpret_long_date(BVAL(dir_data, 24));
+       finfo->ctime_ts = interpret_long_date(BVAL(dir_data, 32));
        finfo->size = IVAL2_TO_SMB_BIG_UINT(dir_data + 40, 0);
        finfo->attr = IVAL(dir_data + 56, 0);
        namelen = IVAL(dir_data + 60,0);
index 853d4e57e202e760437396c9fae4ab1e9b54150e..8a6b944a0d6dac7025e44c75b566b951a7e29747 100644 (file)
@@ -257,7 +257,7 @@ time_t make_unix_date3(const void *date_ptr, int zone_offset);
 time_t srv_make_unix_date(const void *date_ptr);
 time_t srv_make_unix_date2(const void *date_ptr);
 time_t srv_make_unix_date3(const void *date_ptr);
-struct timespec interpret_long_date(const char *p);
+struct timespec interpret_long_date(NTTIME nt);
 void TimeInit(void);
 void get_process_uptime(struct timeval *ret_time);
 void get_startup_time(struct timeval *ret_time);
index 3b96a9d690c092cd9f89e9c3b269113775fcb6f1..ec93f6c534714285a195cc87ed80d2cb70ace018 100644 (file)
@@ -254,10 +254,8 @@ time_t srv_make_unix_date3(const void *date_ptr)
  will be returned as (time_t)-1, whereas nt_time_to_unix returns 0 in this case.
 ****************************************************************************/
 
-struct timespec interpret_long_date(const char *p)
+struct timespec interpret_long_date(NTTIME nt)
 {
-       NTTIME nt;
-       nt = BVAL(p, 0);
        if (nt == (uint64_t)-1) {
                struct timespec ret;
                ret.tv_sec = (time_t)-1;
index d5a167f8dd0e4a60f7daad11c4db77980c7b9ad1..ed4a523bdd883ab2bc84ac3fd6490b2f18fe9a2f 100644 (file)
@@ -1230,10 +1230,10 @@ static NTSTATUS parse_finfo_posix_info(const uint8_t *dir_data,
                return NT_STATUS_INFO_LENGTH_MISMATCH;
        }
 
-       finfo->btime_ts = interpret_long_date((const char *)dir_data + 8);
-       finfo->atime_ts = interpret_long_date((const char *)dir_data + 16);
-       finfo->mtime_ts = interpret_long_date((const char *)dir_data + 24);
-       finfo->ctime_ts = interpret_long_date((const char *)dir_data + 32);
+       finfo->btime_ts = interpret_long_date(BVAL(dir_data, 8));
+       finfo->atime_ts = interpret_long_date(BVAL(dir_data, 16));
+       finfo->mtime_ts = interpret_long_date(BVAL(dir_data, 24));
+       finfo->ctime_ts = interpret_long_date(BVAL(dir_data, 32));
        finfo->allocated_size = PULL_LE_U64(dir_data, 40);
        finfo->size = PULL_LE_U64(dir_data, 48);
        finfo->mode = PULL_LE_U32(dir_data, 56);
@@ -1309,10 +1309,10 @@ static NTSTATUS parse_finfo_id_both_directory_info(const uint8_t *dir_data,
                return NT_STATUS_INFO_LENGTH_MISMATCH;
        }
 
-       finfo->btime_ts = interpret_long_date((const char *)dir_data + 8);
-       finfo->atime_ts = interpret_long_date((const char *)dir_data + 16);
-       finfo->mtime_ts = interpret_long_date((const char *)dir_data + 24);
-       finfo->ctime_ts = interpret_long_date((const char *)dir_data + 32);
+       finfo->btime_ts = interpret_long_date(BVAL(dir_data, 8));
+       finfo->atime_ts = interpret_long_date(BVAL(dir_data, 16));
+       finfo->mtime_ts = interpret_long_date(BVAL(dir_data, 24));
+       finfo->ctime_ts = interpret_long_date(BVAL(dir_data, 32));
        finfo->size = IVAL2_TO_SMB_BIG_UINT(dir_data + 40, 0);
        finfo->allocated_size = IVAL2_TO_SMB_BIG_UINT(dir_data + 48, 0);
        finfo->attr = IVAL(dir_data + 56, 0);
@@ -2887,7 +2887,7 @@ NTSTATUS cli_smb2_get_fs_volume_info(struct cli_state *cli,
 
        if (pdate) {
                struct timespec ts;
-               ts = interpret_long_date((char *)outbuf.data);
+               ts = interpret_long_date(BVAL(outbuf.data, 0));
                *pdate = ts.tv_sec;
        }
        if (pserial_number) {
index b13946d5be8db2c8f9bec991621a051b62fd0201..46b9f27bf4e6019c5bf06fd7844eb644d2a3b943 100644 (file)
@@ -852,13 +852,13 @@ static void cli_posix_stat_done(struct tevent_req *subreq)
        sbuf->st_ex_blocks /= 512;
 #endif
        /* time of last change */
-       sbuf->st_ex_ctime = interpret_long_date((char *)(data + 16));
+       sbuf->st_ex_ctime = interpret_long_date(BVAL(data, 16));
 
        /* time of last access */
-       sbuf->st_ex_atime = interpret_long_date((char *)(data + 24));
+       sbuf->st_ex_atime = interpret_long_date(BVAL(data, 24));
 
        /* time of last modification */
-       sbuf->st_ex_mtime = interpret_long_date((char *)(data + 32));
+       sbuf->st_ex_mtime = interpret_long_date(BVAL(data, 32));
 
        sbuf->st_ex_uid = (uid_t) IVAL(data, 40); /* user ID of owner */
        sbuf->st_ex_gid = (gid_t) IVAL(data, 48); /* group ID of owner */
index 50fb6e52c9f47f75d03d37f836a5f55c82ccdc05..3183e2f4f431ee1e7e5f9428387e5439738b5cd6 100644 (file)
@@ -393,7 +393,7 @@ NTSTATUS cli_get_fs_volume_info(struct cli_state *cli,
 
        if (pdate) {
                struct timespec ts;
-               ts = interpret_long_date((char *)rdata);
+               ts = interpret_long_date(BVAL(rdata, 0));
                *pdate = ts.tv_sec;
        }
        if (pserial_number) {
index 46d6d95b9819c28b6f157863e7f92b3c3a0ed5f3..9ef3f73a24a158d5aeb7a70138587b3494d5fc7e 100644 (file)
@@ -248,11 +248,11 @@ static size_t interpret_long_filename(TALLOC_CTX *ctx,
 
                        /* Offset zero is "create time", not "change time". */
                        p += 8;
-                       finfo->atime_ts = interpret_long_date(p);
+                       finfo->atime_ts = interpret_long_date(BVAL(p, 0));
                        p += 8;
-                       finfo->mtime_ts = interpret_long_date(p);
+                       finfo->mtime_ts = interpret_long_date(BVAL(p, 0));
                        p += 8;
-                       finfo->ctime_ts = interpret_long_date(p);
+                       finfo->ctime_ts = interpret_long_date(BVAL(p, 0));
                        p += 8;
                        finfo->size = IVAL2_TO_SMB_BIG_UINT(p,0);
                        p += 8;
index 2bc873827f28cf5f483e6ca7def4597e4ed2118b..7944eeb847c2e2daf2783f299066812d97ebace4 100644 (file)
@@ -840,10 +840,10 @@ static void cli_qpathinfo2_done2(struct tevent_req *subreq)
        if (tevent_req_nterror(req, status)) {
                return;
        }
-       state->create_time = interpret_long_date((const char *)rdata + 0x0);
-       state->access_time = interpret_long_date((const char *)rdata + 0x8);
-       state->write_time = interpret_long_date((const char *)rdata + 0x10);
-       state->change_time = interpret_long_date((const char *)rdata + 0x18);
+       state->create_time = interpret_long_date(BVAL(rdata, 0x0));
+       state->access_time = interpret_long_date(BVAL(rdata, 0x8));
+       state->write_time = interpret_long_date(BVAL(rdata, 0x10));
+       state->change_time = interpret_long_date(BVAL(rdata, 0x18));
        state->attr = PULL_LE_U32(rdata, 0x20);
        state->size = PULL_LE_U64(rdata, 0x30);
        state->ino = PULL_LE_U64(rdata, 0x40);
@@ -867,10 +867,10 @@ static void cli_qpathinfo2_done(struct tevent_req *subreq)
                return;
        }
 
-       state->create_time = interpret_long_date((char *)data + 0);
-       state->access_time = interpret_long_date((char *)data + 8);
-       state->write_time = interpret_long_date((char *)data + 16);
-       state->change_time = interpret_long_date((char *)data + 24);
+       state->create_time = interpret_long_date(BVAL(data, 0));
+       state->access_time = interpret_long_date(BVAL(data, 8));
+       state->write_time = interpret_long_date(BVAL(data, 16));
+       state->change_time = interpret_long_date(BVAL(data, 24));
        state->attr = PULL_LE_U32(data, 32);
        state->size = PULL_LE_U64(data, 48);
 
@@ -1293,10 +1293,10 @@ static void cli_qfileinfo_basic_done(struct tevent_req *subreq)
                return;
        }
 
-       state->create_time = interpret_long_date((char *)rdata+0);
-       state->access_time = interpret_long_date((char *)rdata+8);
-       state->write_time = interpret_long_date((char *)rdata+16);
-       state->change_time = interpret_long_date((char *)rdata+24);
+       state->create_time = interpret_long_date(BVAL(rdata, 0));
+       state->access_time = interpret_long_date(BVAL(rdata, 8));
+       state->write_time = interpret_long_date(BVAL(rdata, 16));
+       state->change_time = interpret_long_date(BVAL(rdata, 24));
        state->attr = PULL_LE_U32(rdata, 32);
        state->size = PULL_LE_U64(rdata,48);
        state->ino = PULL_LE_U32(rdata, 64);
@@ -1348,14 +1348,10 @@ static void cli_qfileinfo_basic_done2(struct tevent_req *subreq)
                return;
        }
 
-       state->create_time = interpret_long_date(
-               (const char *)outbuf.data + 0x0);
-       state->access_time = interpret_long_date(
-               (const char *)outbuf.data + 0x8);
-       state->write_time = interpret_long_date(
-               (const char *)outbuf.data + 0x10);
-       state->change_time = interpret_long_date(
-               (const char *)outbuf.data + 0x18);
+       state->create_time = interpret_long_date(BVAL(outbuf.data, 0x0));
+       state->access_time = interpret_long_date(BVAL(outbuf.data, 0x8));
+       state->write_time = interpret_long_date(BVAL(outbuf.data, 0x10));
+       state->change_time = interpret_long_date(BVAL(outbuf.data, 0x18));
        state->attr = IVAL(outbuf.data, 0x20);
        state->size = BVAL(outbuf.data, 0x30);
        state->ino = BVAL(outbuf.data, 0x40);
@@ -1527,10 +1523,10 @@ NTSTATUS cli_qpathinfo_basic_recv(struct tevent_req *req,
                return status;
        }
 
-       sbuf->st_ex_btime = interpret_long_date((char *)state->data);
-       sbuf->st_ex_atime = interpret_long_date((char *)state->data+8);
-       sbuf->st_ex_mtime = interpret_long_date((char *)state->data+16);
-       sbuf->st_ex_ctime = interpret_long_date((char *)state->data+24);
+       sbuf->st_ex_btime = interpret_long_date(BVAL(state->data, 0));
+       sbuf->st_ex_atime = interpret_long_date(BVAL(state->data, 8));
+       sbuf->st_ex_mtime = interpret_long_date(BVAL(state->data, 16));
+       sbuf->st_ex_ctime = interpret_long_date(BVAL(state->data, 24));
        *attributes = IVAL(state->data, 32);
        return NT_STATUS_OK;
 }
index 6d55de9912f5840c53e8b9314862e3a10da74aad..4cd75c9e056ea863a04d01d1cb725c8305c50c1e 100644 (file)
@@ -1978,11 +1978,11 @@ static size_t get_filename(TALLOC_CTX *ctx,
        p += 4; /* fileindex */
        /* Offset zero is "create time", not "change time". */
        p += 8;
-       finfo->atime_ts = interpret_long_date((const char *)p);
+       finfo->atime_ts = interpret_long_date(BVAL(p, 0));
        p += 8;
-       finfo->mtime_ts = interpret_long_date((const char *)p);
+       finfo->mtime_ts = interpret_long_date(BVAL(p, 0));
        p += 8;
-       finfo->ctime_ts = interpret_long_date((const char *)p);
+       finfo->ctime_ts = interpret_long_date(BVAL(p, 0));
        p += 8;
        finfo->size = PULL_LE_U64(p, 0);
        p += 8;