From: Volker Lendecke Date: Wed, 4 Oct 2023 11:25:21 +0000 (+0200) Subject: libsmb: Pass NTTIME to interpret_long_date() X-Git-Tag: tevent-0.16.0~237 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cb166028c49d407429adf256ef9f5d53e3bb1fdd;p=thirdparty%2Fsamba.git libsmb: Pass NTTIME to interpret_long_date() Separate concerns of conversion and pulling off the wire. Needed soon for smb311 pidl generated parsing. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/examples/fuse/clifuse.c b/examples/fuse/clifuse.c index 533fe14c2d4..28c5177b250 100644 --- a/examples/fuse/clifuse.c +++ b/examples/fuse/clifuse.c @@ -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); diff --git a/source3/include/proto.h b/source3/include/proto.h index 853d4e57e20..8a6b944a0d6 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -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); diff --git a/source3/lib/time.c b/source3/lib/time.c index 3b96a9d690c..ec93f6c5347 100644 --- a/source3/lib/time.c +++ b/source3/lib/time.c @@ -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; diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c index d5a167f8dd0..ed4a523bdd8 100644 --- a/source3/libsmb/cli_smb2_fnum.c +++ b/source3/libsmb/cli_smb2_fnum.c @@ -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) { diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c index b13946d5be8..46b9f27bf4e 100644 --- a/source3/libsmb/clifile.c +++ b/source3/libsmb/clifile.c @@ -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 */ diff --git a/source3/libsmb/clifsinfo.c b/source3/libsmb/clifsinfo.c index 50fb6e52c9f..3183e2f4f43 100644 --- a/source3/libsmb/clifsinfo.c +++ b/source3/libsmb/clifsinfo.c @@ -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) { diff --git a/source3/libsmb/clilist.c b/source3/libsmb/clilist.c index 46d6d95b981..9ef3f73a24a 100644 --- a/source3/libsmb/clilist.c +++ b/source3/libsmb/clilist.c @@ -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; diff --git a/source3/libsmb/clirap.c b/source3/libsmb/clirap.c index 2bc873827f2..7944eeb847c 100644 --- a/source3/libsmb/clirap.c +++ b/source3/libsmb/clirap.c @@ -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; } diff --git a/source3/torture/test_smb1_dfs.c b/source3/torture/test_smb1_dfs.c index 6d55de9912f..4cd75c9e056 100644 --- a/source3/torture/test_smb1_dfs.c +++ b/source3/torture/test_smb1_dfs.c @@ -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;