]> git.ipfire.org Git - thirdparty/tar.git/commitdiff
Use xalignalloc
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 2 Aug 2024 16:32:11 +0000 (09:32 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 4 Aug 2024 08:41:43 +0000 (01:41 -0700)
It ports around issues that our handwritten code does not.
* gnulib.modules: Add xalignalloc.
* src/misc.c (ptr_align, page_aligned_alloc): Remove.
All page_aligned_alloc callers changed to use xalignalloc.

gnulib.modules
src/buffer.c
src/common.h
src/compare.c
src/misc.c

index 4dc35be48e3b57d561f18ace2b7073032f9a617b..7637b803a8920d14ac22bbc2abacd228a14dfef9 100644 (file)
@@ -119,6 +119,7 @@ unlinkdir
 unlocked-io
 utimensat
 version-etc-fsf
+xalignalloc
 xalloc
 xalloc-die
 xgetcwd
index e76ee9b7fbce1fdd6617d0a398941884b065eb00..9688a368c35d08bfeda7c2d117ea788e314f2b31 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <signal.h>
 
+#include <alignalloc.h>
 #include <c-ctype.h>
 #include <closeout.h>
 #include <fnmatch.h>
@@ -45,7 +46,6 @@
 static tarlong prev_written;    /* bytes written on previous volumes */
 static tarlong bytes_written;   /* bytes written on this volume */
 static void *record_buffer[2];  /* allocated memory */
-static union block *record_buffer_aligned[2];
 static int record_index;
 
 /* FIXME: The following variables should ideally be static to this
@@ -665,11 +665,10 @@ xclose (int fd)
 static void
 init_buffer (void)
 {
-  if (! record_buffer_aligned[record_index])
-    record_buffer_aligned[record_index] =
-      page_aligned_alloc (&record_buffer[record_index], record_size);
+  if (! record_buffer[record_index])
+    record_buffer[record_index] = xalignalloc (getpagesize (), record_size);
 
-  record_start = record_buffer_aligned[record_index];
+  record_start = record_buffer[record_index];
   current_block = record_start;
   record_end = record_start + blocking_factor;
 }
@@ -1139,8 +1138,8 @@ close_archive (void)
   sys_wait_for_child (child_pid, hit_eof);
 
   tar_stat_destroy (&current_stat_info);
-  free (record_buffer[0]);
-  free (record_buffer[1]);
+  alignfree (record_buffer[0]);
+  alignfree (record_buffer[1]);
   bufmap_free (NULL);
 }
 
index 085e7d9618acb884929d7d079a62495fa4cf907a..0120bf463c2b2114693bb4a7e4ec8dd6b1e8fef8 100644 (file)
@@ -766,7 +766,6 @@ _Noreturn void write_fatal (char const *name);
 pid_t xfork (void);
 void xpipe (int fd[2]);
 
-void *page_aligned_alloc (void **ptr, size_t size);
 int set_file_atime (int fd, int parentfd, char const *file,
                    struct timespec atime);
 
index deb9b92efd745b343558d7b62440a3fa3671f89d..4b741c364e3b5c400bfed315e0f2adbed367fc03 100644 (file)
@@ -31,6 +31,7 @@
 #endif
 
 #include "common.h"
+#include <alignalloc.h>
 #include <quotearg.h>
 #include <rmt.h>
 #include <stdarg.h>
@@ -48,8 +49,7 @@ static char *diff_buffer;
 void
 diff_init (void)
 {
-  void *ptr;
-  diff_buffer = page_aligned_alloc (&ptr, record_size);
+  diff_buffer = xalignalloc (getpagesize (), record_size);
   if (listed_incremental_option)
     read_directory_file ();
 }
index 87eb1b8445c7a944e4f9ceae49b4e990f26a0a74..da88c7e46cbebd94a2a2b9fc6fe0e535ce347358 100644 (file)
@@ -1216,33 +1216,6 @@ xpipe (int fd[2])
     call_arg_fatal ("pipe", _("interprocess channel"));
 }
 
-/* Return PTR, aligned upward to the next multiple of ALIGNMENT.
-   ALIGNMENT must be nonzero.  The caller must arrange for ((char *)
-   PTR) through ((char *) PTR + ALIGNMENT - 1) to be addressable
-   locations.  */
-
-static void *
-ptr_align (void *ptr, size_t alignment)
-{
-  char *p0 = ptr;
-  char *p1 = p0 + alignment - 1;
-  return p1 - (size_t) p1 % alignment;
-}
-
-/* Return the address of a page-aligned buffer of at least SIZE bytes.
-   The caller should free *PTR when done with the buffer.  */
-
-void *
-page_aligned_alloc (void **ptr, size_t size)
-{
-  size_t alignment = getpagesize ();
-  size_t size1;
-  if (ckd_add (&size1, size, alignment))
-    xalloc_die ();
-  *ptr = xmalloc (size1);
-  return ptr_align (*ptr, alignment);
-}
-
 \f
 
 struct namebuf