diff --git a/Makefile b/Makefile index 24af13a4..6065522a 100644 --- a/Makefile +++ b/Makefile @@ -136,7 +136,8 @@ libbtrfsutil_minor := $(shell sed -rn 's/^\#define BTRFS_UTIL_VERSION_MINOR ([0- libbtrfsutil_patch := $(shell sed -rn 's/^\#define BTRFS_UTIL_VERSION_PATCH ([0-9])+$$/\1/p' libbtrfsutil/btrfsutil.h) libbtrfsutil_version := $(libbtrfsutil_major).$(libbtrfsutil_minor).$(libbtrfsutil_patch) libbtrfsutil_objects = libbtrfsutil/errors.o libbtrfsutil/filesystem.o \ - libbtrfsutil/subvolume.o libbtrfsutil/qgroup.o + libbtrfsutil/subvolume.o libbtrfsutil/qgroup.o \ + libbtrfsutil/stubs.o convert_objects = convert/main.o convert/common.o convert/source-fs.o \ convert/source-ext2.o convert/source-reiserfs.o mkfs_objects = mkfs/main.o mkfs/common.o mkfs/rootdir.o diff --git a/configure.ac b/configure.ac index 7d80aa49..17dcb3a4 100644 --- a/configure.ac +++ b/configure.ac @@ -43,6 +43,8 @@ AC_PATH_PROG([RMDIR], [rmdir], [rmdir]) AC_CHECK_FUNCS([openat], [], [AC_MSG_ERROR([cannot find openat() function])]) +AC_CHECK_FUNCS([reallocarray]) + m4_ifndef([PKG_PROG_PKG_CONFIG], [m4_fatal([Could not locate the pkg-config autoconf macros. These are usually located in /usr/share/aclocal/pkg.m4. diff --git a/libbtrfsutil/stubs.c b/libbtrfsutil/stubs.c new file mode 100644 index 00000000..9b9e037f --- /dev/null +++ b/libbtrfsutil/stubs.c @@ -0,0 +1,35 @@ +/* + * This file is part of libbtrfsutil. + * + * libbtrfsutil 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 3 of the License, or + * (at your option) any later version. + * + * libbtrfsutil 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 libbtrfsutil. If not, see . + */ + +#if HAVE_REALLOCARRAY != 1 + +#include +#include + +void *reallocarray(void *ptr, size_t nmemb, size_t size) +{ + size_t res; + + res = nmemb * size; + if (res < nmemb || res < size) { + errno = ENOMEM; + return NULL; + } + return realloc(ptr, res); +} + +#endif diff --git a/libbtrfsutil/stubs.h b/libbtrfsutil/stubs.h new file mode 100644 index 00000000..cb6d43ca --- /dev/null +++ b/libbtrfsutil/stubs.h @@ -0,0 +1,22 @@ +/* + * This file is part of libbtrfsutil. + * + * libbtrfsutil 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 3 of the License, or + * (at your option) any later version. + * + * libbtrfsutil 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 libbtrfsutil. If not, see . + */ + +#ifndef _LIBBTRFSUTIL_STUBS_H_ + +void *reallocarray(void *ptr, size_t nmemb, size_t size); + +#endif diff --git a/libbtrfsutil/subvolume.c b/libbtrfsutil/subvolume.c index 965376e3..b9bb99f8 100644 --- a/libbtrfsutil/subvolume.c +++ b/libbtrfsutil/subvolume.c @@ -27,6 +27,7 @@ #include #include #include +#include "stubs.h" #include "btrfsutil_internal.h"