2017-04-11 19:30:27 -07:00
|
|
|
/* -*- mode:c; tab-width:8; c-basic-offset:8; indent-tabs-mode:nil; -*- */
|
|
|
|
|
/*
|
|
|
|
|
Copyright (C) 2017 by Ronnie Sahlberg <ronniesahlberg@gmail.com>
|
|
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
|
it under the terms of the GNU Lesser General Public License as published by
|
|
|
|
|
the Free Software Foundation; either version 2.1 of the License, or
|
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
GNU Lesser General Public License for more details.
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public License
|
|
|
|
|
along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
*/
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
#include "config.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef _GNU_SOURCE
|
|
|
|
|
#define _GNU_SOURCE
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef STDC_HEADERS
|
|
|
|
|
#include <stddef.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_STDINT_H
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_STDLIB_H
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_STRING_H
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
2020-08-06 13:36:42 +10:00
|
|
|
#ifdef HAVE_SYS_TYPES_H
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_UNISTD_H
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
2023-12-23 12:55:04 -03:00
|
|
|
#ifdef HAVE_SYS_UNISTD_H
|
|
|
|
|
#include <sys/unistd.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
2024-05-27 18:35:42 -03:00
|
|
|
#ifdef HAVE_TIME_H
|
|
|
|
|
#include <time.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_SYS_TIME_H
|
|
|
|
|
#include <sys/time.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
2020-08-06 13:36:42 +10:00
|
|
|
#include "compat.h"
|
|
|
|
|
|
2017-04-11 19:30:27 -07:00
|
|
|
#include <smb2.h>
|
|
|
|
|
#include <libsmb2.h>
|
|
|
|
|
#include "libsmb2-private.h"
|
|
|
|
|
|
|
|
|
|
#define container_of(ptr, type, member) ({ \
|
|
|
|
|
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
2025-04-01 18:12:49 +10:00
|
|
|
(type *)(void *)( (char *)__mptr - offsetof(type,member) );})
|
2017-04-11 19:30:27 -07:00
|
|
|
|
|
|
|
|
struct smb2_alloc_entry {
|
|
|
|
|
struct smb2_alloc_entry *next;
|
2024-04-28 19:09:41 -03:00
|
|
|
#if 0 /* UNUSED. */
|
2017-04-11 19:30:27 -07:00
|
|
|
size_t len;
|
2024-01-26 08:41:58 -03:00
|
|
|
#endif
|
2017-04-11 19:30:27 -07:00
|
|
|
char buf[0];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct smb2_alloc_header {
|
|
|
|
|
struct smb2_alloc_entry *mem;
|
|
|
|
|
char buf[0];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void *
|
|
|
|
|
smb2_alloc_init(struct smb2_context *smb2, size_t size)
|
|
|
|
|
{
|
|
|
|
|
struct smb2_alloc_header *ptr;
|
|
|
|
|
|
2017-04-13 18:47:16 -07:00
|
|
|
size += offsetof(struct smb2_alloc_header, buf);
|
|
|
|
|
|
2019-11-02 15:25:25 +01:00
|
|
|
ptr = calloc(size, 1);
|
2017-04-11 19:30:27 -07:00
|
|
|
if (ptr == NULL) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &ptr->buf[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void *
|
2017-04-13 16:18:42 -07:00
|
|
|
smb2_alloc_data(struct smb2_context *smb2, void *memctx, size_t size)
|
2017-04-11 19:30:27 -07:00
|
|
|
{
|
|
|
|
|
struct smb2_alloc_header *hdr;
|
|
|
|
|
struct smb2_alloc_entry *ptr;
|
|
|
|
|
|
2017-04-13 16:18:42 -07:00
|
|
|
size += offsetof(struct smb2_alloc_entry, buf);
|
|
|
|
|
|
2019-11-02 15:25:25 +01:00
|
|
|
ptr = calloc(size, 1);
|
2017-04-11 19:30:27 -07:00
|
|
|
if (ptr == NULL) {
|
|
|
|
|
smb2_set_error(smb2, "Failed to alloc %zu bytes", size);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2018-03-19 17:27:03 +03:00
|
|
|
#ifndef _MSC_VER
|
2025-03-31 21:02:18 +10:00
|
|
|
hdr = (struct smb2_alloc_header *)(void *)container_of(memctx, struct smb2_alloc_header, buf);
|
2018-03-19 17:27:03 +03:00
|
|
|
#else
|
|
|
|
|
{
|
|
|
|
|
const char* __mptr = memctx;
|
|
|
|
|
hdr = (struct smb2_alloc_header*)((char *)__mptr - offsetof(struct smb2_alloc_header, buf));
|
|
|
|
|
}
|
2023-11-22 15:25:09 -03:00
|
|
|
#endif /* !_MSC_VER */
|
2017-04-11 19:30:27 -07:00
|
|
|
|
|
|
|
|
ptr->next = hdr->mem;
|
|
|
|
|
hdr->mem = ptr;
|
|
|
|
|
|
|
|
|
|
return &ptr->buf[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
smb2_free_data(struct smb2_context *smb2, void *ptr)
|
|
|
|
|
{
|
|
|
|
|
struct smb2_alloc_header *hdr;
|
|
|
|
|
struct smb2_alloc_entry *ent;
|
|
|
|
|
|
|
|
|
|
if (ptr == NULL) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2018-03-19 17:27:03 +03:00
|
|
|
#ifndef _MSC_VER
|
2025-03-31 21:02:18 +10:00
|
|
|
hdr = (struct smb2_alloc_header *)(void *)container_of(ptr, struct smb2_alloc_header, buf);
|
2018-03-19 17:27:03 +03:00
|
|
|
#else
|
|
|
|
|
{
|
|
|
|
|
const char* __mptr = ptr;
|
|
|
|
|
hdr = (struct smb2_alloc_header*)((char *)__mptr - offsetof(struct smb2_alloc_header, buf));
|
|
|
|
|
}
|
2023-11-22 15:25:09 -03:00
|
|
|
#endif /* !_MSC_VER */
|
2017-04-11 19:30:27 -07:00
|
|
|
|
|
|
|
|
while ((ent = hdr->mem)) {
|
|
|
|
|
hdr->mem = ent->next;
|
|
|
|
|
free(ent);
|
|
|
|
|
}
|
|
|
|
|
free(hdr);
|
|
|
|
|
}
|